#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);
}
}
Результат выглядит так:
Я знаю, что 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));
}
}
Комментарии:
1. Большое вам спасибо, это сработало как шарм!