2016-12-28 7 views
3

Windowsエクスプローラのメニューバー(win7)の動作をエミュレートしようとしています。WindowsエクスプローラのメニューバーのようにMenuStripを自動非表示にする

this questionを確認しましたが、私の要件を満たしていません。

期待される動作:

  • 押すのAltキー ==>トグルMenuStripvisibleプロパティ。
  • を押す + access key char ==>MenuStripを表示し、対象のメニューを開きます。
  • フォームの他の領域と相互作用します(つまり、無効化MenuStrip)==>MenuStripを非表示にします。

マイ "、最小限の完全な、かつ検証" コード:

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Me.KeyPreview = True 
    menuBar.Visible = False 
End Sub 

Private Sub frmMain_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp 
    If e.KeyCode = Keys.Menu Then ' Requirement #1 
     menuBar.Visible = Not menuBar.Visible 
    End If 
End Sub 

Private Sub frmMain_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 
    If e.Alt AndAlso e.KeyCode <> Keys.Menu Then ' Requirement #2 
     menuBar.Visible = True 
    End If 
End Sub 

Private Sub menuBar_MenuDeactivate(sender As Object, e As EventArgs) Handles menuBar.MenuDeactivate 
    menuBar.Visible = False ' Requirement #3 
End Sub 

問題:

MenuStripが表示されている間、Altキーキーを押すと、イベントMenuDeactivateがトリガーされ、MenuStripが01で非表示になりますとなり、KeyUpに再度表示されます。

私は​​イベントがためであるかどうかKeyDown前にイベントが予期せず、MenuDeactivate火災をKeyUp場合にtrueに設定されているので、私はmenuBar.Visible = Falseを設定する前に、その値を確認することができますが、その後KeyDown場合にはfalseに設定し、ブール値を追加してみましたフォームまたはmenustrip。

すべてのアイデア?

サイドノート:私のコードはVBですが、C#コードの回答は歓迎されます。

答えて

0

私はAltキーキーは、このように、MenuDeactivateイベントでMenuStripを隠す前に、押さえ/押された場合、単純にチェックすることである、この問題の回避策を把握するために管理:

If Not My.Computer.Keyboard.AltKeyDown Then menuBar.Visible = False 

完全な実装誰かが興味を持っている場合:

Private Sub frmMain_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp 
    If e.KeyCode = Keys.Menu Then 
     menuBar.Visible = Not menuBar.Visible 
    End If 
End Sub 

Private Sub frmMain_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 
    If e.Alt AndAlso e.KeyCode <> Keys.Menu Then 
     menuBar.Visible = True 
    ElseIf e.KeyData = Keys.Escape Then 
     menuBar.Visible = False 
    End If 
End Sub 

Private Sub menuBar_MenuDeactivate(sender As Object, e As EventArgs) Handles menuBar.MenuDeactivate 
    If Not My.Computer.Keyboard.AltKeyDown Then menuBar.Visible = False 
End Sub 

誰かを助けることを願って:)

関連する問題