C #: исчезающая стрелка после переопределения OnRenderSplitButtonBackground

#c# #background #toolstrip #toolstripbutton

#c# #фон #панель инструментов #toolstripbutton

Вопрос:

Я пытался изменить фон с ToolStripSplitButton помощью переопределения, но при этом стрелка в раскрывающемся списке исчезает при наведении курсора мыши на кнопку.

Код:

 protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e)
{
    if (!e.Item.Selected)
    {
        base.OnRenderSplitButtonBackground(e);
    }
    else
    {
        Rectangle button = new Rectangle(0, 0, e.Item.Size.Width - 12, e.Item.Size.Height - 1);
        e.Graphics.FillRectangle(Brushes.White, button);
        e.Graphics.DrawRectangle(Pens.Olive, button);

        Rectangle dropdown = new Rectangle(e.ToolStrip.Items[0].Size.Width - 1, 0, e.Item.Size.Width - 32, e.Item.Size.Height - 1);
        e.Graphics.FillRectangle(Brushes.White, dropdown);
        e.Graphics.DrawRectangle(Pens.Olive, dropdown);
    }
}
 

Результат выглядит так:

ToolStripSplitButton

Я знаю, что OnRenderArrow это существует, и я также пытался переопределить это, но, похоже, оно «перезаписано» dropdown прямоугольником внутри OnRenderSplitButtonBackground .

Как я должен это исправить? Заранее спасибо!

Ответ №1:

Если вы приведете базовый класс, который e.Item возвращает свойство (ToolStripItem), к классу ToolStripSplitButton, вы получите все соответствующие свойства для рисования разных частей разделенной кнопки.


Ограничивает такие свойства, как ButtonBounds, DropDownButtonBounds, SplitterBounds. Свойства состояния; buttonPressed, ButtonSelected, DropDownButtonPressed, … и т.д.

Что касается части стрелки. Вам нужно вызвать OnRenderArrow метод.

Пример

 protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e)
{
    if (!e.Item.Selected || e.Item.Pressed)
        base.OnRenderSplitButtonBackground(e);
    else
    {
        var sb = e.Item as ToolStripSplitButton;
        var button = sb.ButtonBounds;
        var dropdown = sb.DropDownButtonBounds;

        button.Width--;
        button.Height--;
        dropdown.Width--;
        dropdown.Height--;

        var br = sb.ButtonPressed ? Brushes.Gainsboro : Brushes.White;

        e.Graphics.FillRectangle(br, button);
        e.Graphics.DrawRectangle(Pens.Olive, button);
        e.Graphics.FillRectangle(Brushes.White, dropdown);
        e.Graphics.DrawRectangle(Pens.Olive, dropdown);

        OnRenderArrow(new ToolStripArrowRenderEventArgs(
            e.Graphics, e.Item, sb.DropDownButtonBounds, e.Item.ForeColor,
            ArrowDirection.Down));
    }
}
 

SOQ65328100

Комментарии:

1. Большое вам спасибо, это сработало как шарм!