我正在尝试模拟 Windows 资源管理器菜单栏 (win7) 的行为。
我检查了this question它不符合我的要求。
预期行为:
- 按 Alt 键 ==> 切换
MenuStrip
的visible
属性。 - 按 Alt+
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
上再次显示。
我尝试添加一个 bool 值,在 KeyDown
事件中将其设置为 false,然后在 KeyUp
事件中将其设置为 true,因此我可以在设置 之前检查它的值menuBar.Visible = False
但出乎意料的是,事件 MenuDeactivate
在 KeyDown
之前触发,无论 keydown
事件是针对表单还是菜单条.
有什么想法吗?
旁注:虽然我的代码是在 VB 中,但欢迎使用 C# 代码的任何答案。
最佳答案
我设法找到解决此问题的方法,即在隐藏 MenuStrip
之前简单地检查是否按下了 Alt 键。在MenuDeactivate
事件,像这样:
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
希望它能对某人有所帮助:)
关于c# - 像 Windows 资源管理器菜单栏一样自动隐藏 MenuStrip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41363312/