У меня есть этот 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
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;
}
}
Похожие вопросы
Новые вопросы
vb.net
Visual Basic.NET (VB.NET) - это мультипарадигмальный, управляемый, типобезопасный, объектно-ориентированный язык компьютерного программирования. Наряду с C # и F # это один из основных языков, нацеленных на .NET Framework. VB.NET можно рассматривать как эволюцию Microsoft Visual Basic 6 (VB6), но реализованную в Microsoft .NET Framework. НЕ ИСПОЛЬЗУЙТЕ этот тег для вопросов VB6, VBA или VBScript.
MenuDeactivate
продолжение, чтобы уменьшить полосу до только изображений сразу после деактивации меню. Отредактировал свой пост, чтобы добавить версию VB.NET. Большое спасибо!