代码之家  ›  专栏  ›  技术社区  ›  serialhobbyist

如何在WPF中使用Alt键切换主菜单的可见性?

  •  8
  • serialhobbyist  · 技术社区  · 16 年前

    我希望WPF应用程序中的主菜单与IE8中的主菜单一样:

    • 应用程序启动时它不可见
    • 按下并释放Alt可使其可见
    • 再次按下并释放Alt将使其再次不可见
    • 重复,直到无聊为止

    我该怎么做?它必须是代码吗?

    在回复提交的答案时添加,因为我仍然有问题:

    我的Shell代码如下所示:

    public partial class Shell : Window
    {
        public static readonly DependencyProperty IsMainMenuVisibleProperty;
    
        static Shell()
        {
            FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
            metadata.DefaultValue = false;
    
            IsMainMenuVisibleProperty = DependencyProperty.Register(
                "IsMainMenuVisible", typeof(bool), typeof(Shell), metadata);
        }
    
        public Shell()
        {
            InitializeComponent();
    
            this.PreviewKeyUp += new KeyEventHandler(Shell_PreviewKeyUp);
        }
    
        void Shell_PreviewKeyUp(object sender, KeyEventArgs e)
        {
            if (e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt)
            {
                if (IsMainMenuVisible == true)
                    IsMainMenuVisible = false;
                else
                    IsMainMenuVisible = true;
            }
        }
    
        public bool IsMainMenuVisible
        {
            get { return (bool)GetValue(IsMainMenuVisibleProperty); }
            set { SetValue(IsMainMenuVisibleProperty, value); }
        }
    }
    
    4 回复  |  直到 16 年前
        1
  •  8
  •   Jasper wontondon    14 年前

    你可以使用 PreviewKeyDown 窗口上的事件。探测 中高音 您将需要检查 SystemKey KeyEventArgs

    您可以使用此事件设置 bool 已声明为 DependencyProperty 在windows代码隐藏中。

    菜单是 Visibility 然后,可以使用 BooleanToVisibilityConverter .

    <Menu 
        Visibility={Binding Path=IsMenuVisibile, 
            RelativeSource={RelativeSource AncestorType=Window},
            Converter={StaticResource BooleanToVisibilityConverter}}
        />
    
        2
  •  2
  •   Jasper wontondon    14 年前

    我自己也遇到了这个问题。我试着钩住那根绳子 PreviewKeyDown InputManager 类,您可以在其中连接到 EnterMenuMode 来自托管代码。管理器公开了两个事件,分别是enter和exit。诀窍是不要折叠菜单,而是在隐藏菜单时将其容器高度设置为零。要显示它,只需清除局部值,它将采用以前的高度。

    从我的 TopMenu 用户控制:

    public TopMenu()
    {
        InitializeComponent();
        InputManager.Current.EnterMenuMode += OnEnterMenuMode;
        InputManager.Current.LeaveMenuMode += OnLeaveMenuMode;
        Height = 0;
    }
    
    private void OnLeaveMenuMode(object sender, System.EventArgs e)
    {
        Height = 0;
    }
    
    private void OnEnterMenuMode(object sender, System.EventArgs e)
    {
        ClearValue(HeightProperty);
    }
    
        3
  •  1
  •   Andy    16 年前

    PreviewKeyDown 事件显示在您的窗口上。我不确定按Alt键是否触发此事件,但如果触发,则我会切换 bool

    如果 预览向下 不行,我不知道还有什么好尝试的。您可以查看发送到窗口的实际Windows消息,但这可能会很快变得混乱。

        4
  •  1
  •   Jasper wontondon    14 年前

    最好使用 GetKeyboardState 具有 VK_MENU 左右兼顾 中高音 VK_菜单 PreviewKeyUp (没有下降)。

        5
  •  0
  •   rittergig    6 年前

    请参阅我对以下主题的回答: How to make WPF MenuBar visibile when ALT-key is pressed?

    在这里,我描述了如何在课堂上解决你的问题 InputManager (来自命名空间) System.Windows.Input ).

    您可以注册类事件 EnterMenuMode LeaveMenuMode .