Как я могу нарисовать стрелки на левом закрепленном MenuStrip?
У меня есть форма C#, в которую я поместил левую док-станцию MenuStrip
, это MenuStrip
содержит некоторые пункты меню, которые содержат подменю, и некоторые пункты меню, которые фактически являются кнопками (нажатие на них приводит к действию; заметьте, я понимаю, что это не очень хороший дизайн).
Я хотел бы, чтобы пункты меню, с которыми связаны меню, рисовали стрелку, указывающую вправо, на элементе меню, так же как контекстное меню. Я подкласс ToolStripProfessionalRenderer
и можете позвонить OnRenderArrow()
в соответствующее время (например, в течение OnRenderItemText()
или аналогичный), но у меня нет способа определить правильное расположение стрелки.
Итак, два взаимосвязанных вопроса здесь:
- Есть ли способ заставить стрелки быть нарисованы на пунктах меню верхнего уровня?
- Если нет, есть ли способ определить правильное расположение стрелки на пункте меню, чтобы
OnRenderArrow()
можно вызвать вручную?
Спасибо!
2 ответа
Почему вы не изучаете использование System.Windows.Forms.ToolStrip, а не MenuStrip. Это позволит вам встроить функциональность стрелки и даже решить проблему с плохим дизайном.
При желании вы можете указать, что элементы панели инструментов не показывают изображения, а показывают только текст. Таким образом, вы можете почти точно имитировать функциональность Menustrip, но получить "стрелки вниз" бесплатно.
Я мог взломать это вместе как решение, но я все еще хотел бы что-то менее тупое:
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
base.OnRenderItemText(e);
if (e.Item.GetType() == typeof(ToolStripMenuItem))
{
ToolStripMenuItem tsmi = (ToolStripMenuItem)e.Item;
if (tsmi.HasDropDownItems && tsmi.OwnerItem == null)
{
Rectangle bounds = tsmi.Bounds;
bounds.X = bounds.Right - 25;
bounds.Width = 25;
bounds.Y = 0;
ToolStripArrowRenderEventArgs tsarea = new ToolStripArrowRenderEventArgs(
e.Graphics,
e.Item,
bounds,
e.TextColor,
ArrowDirection.Right);
OnRenderArrow(tsarea);
}
}
}