自动隐藏MenuStrip,如Windows资源管理器菜单栏

时间:2016-12-28 13:39:41

标签: c# vb.net winforms

我试图模仿Windows资源管理器菜单栏(win7)的行为。

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

预期行为:

  • Alt 键==>切换visible
  • MenuStrip属性
  • 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 键,会触发事件MenuDeactivateMenuStrip隐藏在KeyDown上,然后再在KeyUp上显示。

我尝试添加一个布尔值,在KeyDown事件中将其设置为false,然后在KeyUp事件中将其设置为true,这样我可以在设置menuBar.Visible = False之前检查其值,但是,意外的是事件MenuDeactivate会在KeyDown之前触发keydown事件是否适用于表单或menustrip。

任何想法?

旁注:虽然我的代码是在VB中,但欢迎任何使用C#代码的答案。

1 个答案:

答案 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

希望它会帮助某人:)

相关问题