【发布时间】:2016-12-28 13:39:41
【问题描述】:
我正在尝试模拟 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 上再次显示.
我尝试添加一个布尔值,在 KeyDown 事件中将其设置为 false,然后在 KeyUp 事件中将其设置为 true,这样我就可以在设置 menuBar.Visible = False 之前检查它的值,但是,意外地事件 MenuDeactivate 之前触发KeyDown keydown 事件是针对表单还是菜单条。
有什么想法吗?
旁注:虽然我的代码是用 VB 编写的,但欢迎使用 C# 代码回答。
【问题讨论】:
-
要查看支持鼠标和键盘激活的工作示例,请查看:Auto-hide menu in Windows Forms。另外当用alt键显示时,最好也激活菜单,这样用户也可以使用导航键在菜单之间导航。