[英]Auto-hide MenuStrip like Windows Explorer menu bar
我正在嘗試模擬Windows資源管理器菜單欄(win7)的行為。
我檢查了這個問題但它不符合我的要求。
預期行為:
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
,並在KeyDown
隱藏MenuStrip
,然后在KeyUp
再次顯示。
我嘗試添加一個布爾值,在KeyDown
事件中將其設置為false,然后在KeyUp
事件中將其設置為true,因此我可以在設置menuBar.Visible = False
之前檢查其值,但是,意外地,事件MenuDeactivate
在KeyDown
之前觸發,無論keydown
事件是否為形式或menustrip。
有任何想法嗎?
旁注 :盡管我的代碼是在VB中,但歡迎使用C#代碼的任何答案。
我設法找出了解決這個問題的方法,即在MenuDeactivate
事件中隱藏MenuStrip
之前,只需檢查是否按下了Alt鍵,如下所示:
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
希望它會幫助別人:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.