我如何可以切换使用WPF Alt键在主菜单中的知名度?(How can I toggle the m

2019-06-27 12:55发布

我想在我的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); }
    }
}

Answer 1:

您可以使用PreviewKeyDown窗口上的事件。 为了检测Alt键,您将需要检查SystemKey的财产KeyEventArgs ,而不是您通常使用的大多数其他键的键属性。

您可以使用此事件来设置一个bool已被宣布为一个值DependencyProperty在后面的Windows代码。

菜单的Visibility ,然后属性可以绑定到使用该属性BooleanToVisibilityConverter

<Menu 
    Visibility={Binding Path=IsMenuVisibile, 
        RelativeSource={RelativeSource AncestorType=Window},
        Converter={StaticResource BooleanToVisibilityConverter}}
    />


Answer 2:

我会尝试寻找到处理PreviewKeyDown你的窗口上的事件。 我不知道,如果按Alt触发此事件或没有,但如果这样做,那么我会切换一个bool这势必会在窗口的主菜单的可见性。

如果PreviewKeyDown不工作,我不知道什么尝试。 你可以看看在发送到你的窗口实际的Windows消息得到,但可能会导致混乱的非常快。



Answer 3:

这将是更好地使用GetKeyboardStateVK_MENU处理左,右Alt,模仿IE / Windows资源管理器(Vista的+)的行为,你就需要跟踪先前的焦点内容存储的焦点,在VK_MENU按同时聚焦元素是你的主菜单中。 你也想在做这方面的工作PreviewKeyUp (不下来)。



Answer 4:

我只是碰到这种问题就来了自己。 我试图钩住PreviewKeyDown事件,但发现它是不可靠的。 相反,我发现InputManager类,你可以挂接到EnterMenuMode从托管代码。 经理公开两个事件,进入和退出。 诀窍是不会崩溃的菜单,但设置它的容器高度为零当它被隐藏。 要显示它,只需清除本地值,它会采取以前的高度。

从我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);
}


文章来源: How can I toggle the main menu visibility using the Alt key in WPF?