Измените BackColor элемента управления ToolStripSeparator.

Можно ли изменить BackColor элемента управления ToolStripSeparator? В дизайнере есть свойство BackColor, но оно, похоже, не используется - цвет всегда белый.


person Siwar    schedule 10.04.2013    source источник


Ответы (3)


Средство визуализации по умолчанию toolstrip игнорирует свойство BackColor и использует жестко запрограммированные цвета.

Вы можете перейти по следующей ссылке, чтобы использовать свой собственный рендерер для рисования разделителей так, как вы хотите.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        toolStrip1.Renderer = new MyRenderer();
    }
    
    private class MyRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
        {
            if ((e.Item as ToolStripSeparator) == null)
            {
                base.OnRenderSeparator(e);
                return;
            }
            Rectangle bounds = new Rectangle(Point.Empty, e.Item.Size);
            bounds.Y += 3;
            bounds.Height = Math.Max(0, bounds.Height - 6);
            if (bounds.Height >= 4)
                bounds.Inflate(0, -2);
            int x = bounds.Width / 2;
            using(Pen pen = new Pen(Color.DarkBlue))
                e.Graphics.DrawLine(pen, x, bounds.Top, x, bounds.Bottom - 1);
            using (Pen pen = new Pen(Color.Blue))
                e.Graphics.DrawLine(pen, x + 1, bounds.Top + 1, x + 1, bounds.Bottom);
        }
    }
}

Источник: http://social.msdn.microsoft.com/forums/en-US/winforms/thread/6cceab5b-7e06-40cf-82da-56cdcc57eb5d

person Freelancer    schedule 10.04.2013
comment
Я видел эту статью, но я ищу другое решение, я не думаю, что это лучшее решение - person Siwar; 10.04.2013
comment
Я также исследовал это, но не нашел другой подходящей альтернативы, это была лучшая альтернатива для практики. - person Freelancer; 10.04.2013
comment
я поместил этот код в Menu.designer.cs this.fileToolStripMenuItem.BackColor = System.Drawing.SystemColors.ButtonFace; но это не работает - person Siwar; 10.04.2013
comment
Этот код работал у меня, но мне пришлось закомментировать тест !e.Vertical, прежде чем он это сделал. - person Surfbutler; 29.08.2014
comment
Я добавил код из указанного источника до разрыва ссылки, иначе в любом случае это был бы 99% ответ только по ссылке. - person sɐunıɔןɐqɐp; 27.04.2021

Я вижу, что вопрос был задан 2 года назад, но я до сих пор не могу найти простого и понятного решения в Интернете. Так...

Я только что столкнулся с проблемой сегодня и обнаружил, что решить ее довольно просто.

Имея такую ​​же ситуацию:

введите здесь описание изображения

Решение:

Создайте класс, который наследует класс ToolStripSeparator, и добавьте метод к Paint EventHandler для рисования разделителя:

public class ExtendedToolStripSeparator : ToolStripSeparator
{
    public ExtendedToolStripSeparator()
    {
        this.Paint += ExtendedToolStripSeparator_Paint;
    }

    private void ExtendedToolStripSeparator_Paint(object sender, PaintEventArgs e)
    {
        // Get the separator's width and height.
        ToolStripSeparator toolStripSeparator = (ToolStripSeparator)sender;
        int width = toolStripSeparator.Width;
        int height = toolStripSeparator.Height;

        // Choose the colors for drawing.
        // I've used Color.White as the foreColor.
        Color foreColor = Color.FromName(Utilities.Constants.ControlsRelatedConstants.standardForeColorName);
        // Color.Teal as the backColor.
        Color backColor = Color.FromName(Utilities.Constants.ControlsRelatedConstants.standardBackColorName);

        // Fill the background.
        e.Graphics.FillRectangle(new SolidBrush(backColor), 0, 0, width, height);

        // Draw the line.
        e.Graphics.DrawLine(new Pen(foreColor), 4, height / 2, width - 4, height / 2);
    }
}

Затем добавьте разделитель:

ToolStripSeparator toolStripSeparator = new ExtendedToolStripSeparator();

this.DropDownItems.Add(newGameToolStripMenuItem);
this.DropDownItems.Add(addPlayerToolStripMenuItem);
this.DropDownItems.Add(viewResultsToolStripMenuItem);
// Add the separator here.
this.DropDownItems.Add(toolStripSeparator);
this.DropDownItems.Add(exitToolStripMenuItem);

Результат:

введите здесь описание изображения

person ChocapicSz    schedule 27.06.2015

Я только что указал событие Paint моих разделителей на этот пользовательский процесс:

    private void mnuToolStripSeparator_Custom_Paint (Object sender, PaintEventArgs e)
    {
        ToolStripSeparator sep = (ToolStripSeparator)sender;

        e.Graphics.FillRectangle(new SolidBrush(CUSTOM_COLOR_BACKGROUND), 0, 0, sep.Width, sep.Height);

        e.Graphics.DrawLine(new Pen(CUSTOM_COLOR_FOREGROUND), 30, sep.Height / 2, sep.Width - 4, sep.Height / 2);

    }

Где CUSTOM_COLOR_FOREGROUND — сплошной/именованный цвет, например, Color.White.

person Flood    schedule 16.07.2016