2017-06-29 21 views
0

私はこのMenuStripLayoutStyle = VerticalStackWithOverflowと、フォーム内で左にドッキングしている、と私はその項目は、ユーザがMenuStripの上にマウスを移動した場合にのみ、そのテキストを表示するために、これらの2つのイベントハンドラを書いた:MenuStripの項目の1つがサブ項目に展開されたときを検出する方法は?

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 

これが働いているが、 MenuItemの中にはMenuItem(メニューツリーの選択肢)があり、ユーザーがルートのMenuStripからオプションにマウスを移動すると、MenuStripは「アイコンのみ」モードに縮小され、拡張されたメニューは不思議です。

MenuStripが項目の1つをサブアイテムに展開したときに検出する方法はありますか?適切な調整ルーチンを停止できますか?

ありがとうございました!

EDIT

これは 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

関連する問題