8

我希望我的 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

5 回答 5

8

您可以使用PreviewKeyDown窗口上的事件。要检测Alt密钥,您需要检查 的SystemKey属性KeyEventArgs,而不是通常用于大多数其他密钥的 Key 属性。

您可以使用此事件来设置boolDependencyProperty在后面的 windows 代码中声明为 a 的值。

Visibility然后可以使用.将菜单的属性绑定到此属性BooleanToVisibilityConverter

<Menu 
    Visibility={Binding Path=IsMenuVisibile, 
        RelativeSource={RelativeSource AncestorType=Window},
        Converter={StaticResource BooleanToVisibilityConverter}}
    />
于 2009-08-02T13:48:36.267 回答
2

我自己也遇到了这个问题。我尝试加入PreviewKeyDown事件,但发现它不可靠。相反,我找到了InputManager可以挂钩EnterMenuModefrom 托管代码的类。管理器公开了两个事件,用于进入和退出。诀窍是不要折叠菜单,而是在隐藏菜单时将其容器高度设置为零。要显示它,只需清除本地值,它将采用以前的高度。

从我的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);
}
于 2011-05-18T09:22:57.700 回答
1

我会尝试处理PreviewKeyDown您窗口上的事件。我不确定按下 Alt 是否会触发此事件,但如果确实如此,那么我会切换bool绑定到窗口主菜单可见性的 a 。

如果PreviewKeyDown不起作用,我不确定还能尝试什么。您可以查看发送到您窗口的实际 Windows 消息,但这可能会很快变得混乱。

于 2009-08-02T12:45:48.397 回答
1

最好使用GetKeyboardStatewithVK_MENU来处理 left 和 right Alt,以模仿 IE / Windows Explorer (Vista+) 的行为,您需要跟踪先前聚焦的元素以存储焦点,VK_MENU而焦点元素在您的内部主菜单。PreviewKeyUp您还希望在(而不是向下)上进行这项工作。

于 2009-08-02T18:16:18.257 回答
0

请参阅我对以下主题的回答: 按下 ALT 键时如何使 WPF 菜单栏可见?

在那里,我描述了如何用类InputManager(来自 namespace System.Windows.Input)解决您的问题。

您可以注册类事件EnterMenuModeLeaveMenuMode.

于 2020-05-05T20:11:35.873 回答