У меня есть этот MenuStrip, закрепленный в левой части формы с LayoutStyle = VerticalStackWithOverflow, и я написал эти два обработчика событий, чтобы их элементы отображали свой текст только тогда, когда пользователь наводит указатель мыши на MenuStrip:

Private Sub MenuStripMainMenu_MouseEnter(sender As Object, e As EventArgs) Handles MenuStripMainMenu.MouseEnter
    For Each c In MenuStripMainMenu.Items.OfType(Of ToolStripItem)
        c.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
    Next
End Sub

Private Sub MenuStripMainMenu_MouseLeave(sender As Object, e As EventArgs) Handles MenuStripMainMenu.MouseLeave, MenuStripMainMenu.LostFocus
    For Each c In MenuStripMainMenu.Items.OfType(Of ToolStripItem)
        c.DisplayStyle = ToolStripItemDisplayStyle.Image
    Next
End Sub

Хотя это работает нормально, некоторые из MenuItems имеют свои собственные MenuItems (в виде дерева выбора), и когда пользователь перемещает мышь из корневого MenuStrip к параметрам, MenuStrip сжимается обратно в свой режим «только для значков», поэтому расширенный меню выглядит коряво.

Есть ли способ определить, когда MenuStrip расширяет один из своих элементов до его подэлементов, чтобы я мог повесить правильные процедуры настройки?

Большое спасибо!

ИЗМЕНИТЬ

Это ответ ДонБойтнотта, перенесенный на VB.NET, я добавил только продолжение в обработчике MenuDeactivate, чтобы уменьшите полосу до изображений только после отключения меню:

Private MenuStripMainMenu_activated As Boolean = False

Private Sub MenuStripMainMenu_MenuActivate(sender As Object, e As EventArgs) Handles MenuStripMainMenu.MenuActivate
    MenuStripMainMenu_activated = True
End Sub

Private Sub MenuStripMainMenu_MenuDeactivate(sender As Object, e As EventArgs) Handles MenuStripMainMenu.MenuDeactivate
    MenuStripMainMenu_activated = False
    MenuStripMainMenu_MouseLeave(sender, e)
End Sub

Private Sub MenuStripMainMenu_MouseEnter(sender As Object, e As EventArgs) Handles MenuStripMainMenu.MouseEnter
    For Each c In MenuStripMainMenu.Items.OfType(Of ToolStripItem)
        c.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
    Next
End Sub

Private Sub MenuStripMainMenu_MouseLeave(sender As Object, e As EventArgs) Handles MenuStripMainMenu.MouseLeave
    If Not MenuStripMainMenu_activated Then
        For Each c In MenuStripMainMenu.Items.OfType(Of ToolStripItem)
            c.DisplayStyle = ToolStripItemDisplayStyle.Image
        Next
    End If
End Sub
0
VBobCat 29 Июн 2017 в 18:10

1 ответ

Лучший ответ

Комбинация текущих событий и добавление MenuActivate и MenuDeactivate могут привести к следующим действиям:

 public partial class Form1 : Form
    {
        private Boolean _activated = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void menuStrip1_MouseEnter(Object sender, EventArgs e)
        {
            foreach (var c in menuStrip1.Items.OfType<ToolStripItem>())
                c.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
        }

        private void menuStrip1_MouseLeave(Object sender, EventArgs e)
        {
            if (!_activated)
            {
                foreach (var c in menuStrip1.Items.OfType<ToolStripItem>())
                    c.DisplayStyle = ToolStripItemDisplayStyle.Image;
            }
        }

        private void menuStrip1_MenuActivate(Object sender, EventArgs e)
        {
            _activated = true;
        }

        private void menuStrip1_MenuDeactivate(Object sender, EventArgs e)
        {
            _activated = false;
            foreach (var c in menuStrip1.Items.OfType<ToolStripItem>())
                c.DisplayStyle = ToolStripItemDisplayStyle.Image;
        }
    }
2
DonBoitnott 29 Июн 2017 в 19:26
1
Идеально! Я только что добавил в обработчик MenuDeactivate продолжение, чтобы уменьшить полосу до только изображений сразу после деактивации меню. Отредактировал свой пост, чтобы добавить версию VB.NET. Большое спасибо!
 – 
VBobCat
29 Июн 2017 в 20:48