Как я могу нарисовать стрелки на левом закрепленном MenuStrip?

У меня есть форма C#, в которую я поместил левую док-станцию MenuStrip, это MenuStrip содержит некоторые пункты меню, которые содержат подменю, и некоторые пункты меню, которые фактически являются кнопками (нажатие на них приводит к действию; заметьте, я понимаю, что это не очень хороший дизайн).

Я хотел бы, чтобы пункты меню, с которыми связаны меню, рисовали стрелку, указывающую вправо, на элементе меню, так же как контекстное меню. Я подкласс ToolStripProfessionalRenderer и можете позвонить OnRenderArrow() в соответствующее время (например, в течение OnRenderItemText() или аналогичный), но у меня нет способа определить правильное расположение стрелки.

Итак, два взаимосвязанных вопроса здесь:

  1. Есть ли способ заставить стрелки быть нарисованы на пунктах меню верхнего уровня?
  2. Если нет, есть ли способ определить правильное расположение стрелки на пункте меню, чтобы 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);
        }
    }
}
Другие вопросы по тегам