2017-06-29 1 views
0

Je possède ce MenuStrip gauche désamarré dans un formulaire, avec LayoutStyle = VerticalStackWithOverflow, et je l'ai écrit ces deux gestionnaires d'événements pour faire ses articles montrent leur texte que lorsque l'utilisateur déplace la souris sur la MenuStrip:Comment détecter quand un objet MenuStrip étend l'un de ses éléments à ses sous-éléments?

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 

Bien que cela fonctionne ok, certains des MenuItems ont leur propre MenuItems (comme un arbre de choix) et quand l'utilisateur déplace la souris de la racine MenuStrip aux options, le MenuStrip rétrécit à son mode "icône seulement", de sorte que le menu étendu semble maladroit.

Y at-il un moyen de détecter quand un MenuStrip étend l'un de ses éléments à ses sous-éléments, afin que je puisse accrocher les routines de réglage appropriées?

Merci beaucoup!

EDIT

Ceci est DonBoitnott's answer porté à VB.NET, je seulement ajouté un suivi en MenuDeactivate gestionnaire, à rétrécir la bande en arrière à droite après que des images menu est désactivé:

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 

Répondre

2

Une combinaison des événements que vous avez actuellement, et en ajoutant MenuActivate et MenuDeactivate peuvent être faits à se comporter:

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

Parfait! Je viens d'ajouter un suivi dans le gestionnaire 'MenuDeactivate', pour rétrécir la bande aux images juste après la désactivation du menu. J'ai édité mon post pour ajouter la version de VB.NET. Merci beaucoup! – VBobCat