2017-06-29 41 views
0

我有这个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 

回答

2

您目前拥有的事件的组合,并加入MenuActivateMenuDeactivate可制成表现:

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; 
     } 
    } 
+1

完美!我只是在'MenuDeactivate'处理程序中添加了一个后续处理,以便在菜单停用后立即将条带缩回为只有图像。编辑我的帖子以添加VB.NET版本。非常感谢! – VBobCat

相关问题