c# - 像 Windows 资源管理器菜单栏一样自动隐藏 MenuStrip

标签 c# vb.net winforms

我正在尝试模拟 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 键时,将触发事件 MenuDeactivate 并且 MenuStripKeyDown 上隐藏,然后在 KeyUp 上再次显示。

我尝试添加一个 bool 值,在 KeyDown 事件中将其设置为 false,然后在 KeyUp 事件中将其设置为 true,因此我可以在设置 之前检查它的值menuBar.Visible = False 但出乎意料的是,事件 MenuDeactivateKeyDown 之前触发,无论 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/

相关文章:

c# - 有签名识别的代码或算法吗?

C# 变量作用域 : 'x' cannot be declared in this scope because it would give a different meaning to 'x'

c# - Bang 与 Visual Basic 中的默认属性

vb.net - 带有字符串索引或替代的枚举

c# - 从后台 worker 更新 GUI

c# - 使用递归的未知循环数

vb.net - 无法在 VB.Net 中设置 SeriesCollection.Values 属性

c# - Httpwebrequest 问题 (503)

c# - 使用 For 循环滑动对象 (C#)

c# - 在 WPF 中执行选项卡式应用程序的正确方法