【问题标题】:Auto-hide MenuStrip like Windows Explorer menu bar像 Windows Explorer 菜单栏一样自动隐藏 MenuStrip
【发布时间】:2016-12-28 13:39:41
【问题描述】:

我正在尝试模拟 Windows 资源管理器菜单栏 (win7) 的行为。

我检查了this question,它不符合我的要求。

预期行为:

  • Alt 键 ==> 切换 MenuStripvisible 属性。
  • 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 键,触发事件MenuDeactivateMenuStripKeyDown 上隐藏,然后在KeyUp 上再次显示.

我尝试添加一个布尔值,在 KeyDown 事件中将其设置为 false,然后在 KeyUp 事件中将其设置为 true,这样我就可以在设置 menuBar.Visible = False 之前检查它的值,但是,意外地事件 MenuDeactivate 之前触发KeyDown keydown 事件是针对表单还是菜单条。

有什么想法吗?

旁注:虽然我的代码是用 VB 编写的,但欢迎使用 C# 代码回答。

【问题讨论】:

  • 要查看支持鼠标和键盘激活的工作示例,请查看:Auto-hide menu in Windows Forms。另外当用alt键显示时,最好也激活菜单,这样用户也可以使用导航键在菜单之间导航。

标签: c# vb.net winforms


【解决方案1】:

我设法找到了解决此问题的方法,即在 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

希望对某人有所帮助:)

【讨论】:

    猜你喜欢
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多