Windowsエクスプローラのメニューバー(win7)の動作をエミュレートしようとしています。WindowsエクスプローラのメニューバーのようにMenuStripを自動非表示にする
this questionを確認しましたが、私の要件を満たしていません。
期待される動作:
- 押すのAltキー ==>トグル
MenuStrip
のvisible
プロパティ。 - を押す +
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#コードの回答は歓迎されます。