如何检测MenuStrip何时将其中一个项目扩展到其子项目?
问题描述:
我有这个MenuStrip
左停靠在一个形式,LayoutStyle = VerticalStackWithOverflow
,我写了这两个事件处理程序,以使其项目显示,只有当用户在MenuStrip中移动鼠标的文本:如何检测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的某个项目扩展到它的子项目,所以我可以挂上适当的调整例程?
非常感谢!
编辑
这DonBoitnott's answer移植到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
答
您目前拥有的事件的组合,并加入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;
}
}
完美!我只是在'MenuDeactivate'处理程序中添加了一个后续处理,以便在菜单停用后立即将条带缩回为只有图像。编辑我的帖子以添加VB.NET版本。非常感谢! – VBobCat