我试图模仿Windows资源管理器菜单栏(win7)的行为。
我检查了this question,但它不符合我的要求。
预期行为:
visible
。MenuStrip
属性
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
隐藏在KeyDown
上,然后再在KeyUp
上显示。
我尝试添加一个布尔值,在KeyDown
事件中将其设置为false,然后在KeyUp
事件中将其设置为true,这样我可以在设置menuBar.Visible = False
之前检查其值,但是,意外的是事件MenuDeactivate
会在KeyDown
之前触发keydown
事件是否适用于表单或menustrip。
任何想法?
旁注:虽然我的代码是在VB中,但欢迎任何使用C#代码的答案。
答案 0 :(得分:0)
我设法找出了解决此问题的方法,即在MenuStrip
中隐藏MenuDeactivate
之前,只需检查是否按下 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
希望它会帮助某人:)