我的主菜单在我WPF应用程序来表现得像主菜单在IE8:

  • 这是不可见的,当应用程序的开始
  • 按下和释放Alt使得可见
  • 按下和释放Alt再次让它再次看不见
  • 重复,直到厌倦

我怎么可以这样做?它必须是代码?

响应加以回答提出的,因为我仍然有麻烦:

我的外壳的代码隐藏现在看起来是这样的:

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); }
    }
}
有帮助吗?

解决方案

你可以使用 PreviewKeyDown 活动的窗口。来检测 Alt 关键你会需要检查 SystemKey 酒店的 KeyEventArgs, 而不是关键的财产,通常使用对于大多数其他的钥匙。

你可以使用这一事件来设置一个 bool 值已被宣布为 DependencyProperty 在窗户代码后面。

菜单上的 Visibility 酒店然后可以开这种财产的使用 BooleanToVisibilityConverter.

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

其他提示

我会试着找到处理的 PreviewKeyDown 事件在你的窗口。我不确定如果按Alt触发这一事件或者没有,但如果这样做,那么我切换一个 bool 这是必要的可见度的主菜单窗口。

如果 PreviewKeyDown 不行,我不确定还有什么要尝试。你可以看得到的实际Windows消息发送给你的窗口,但是,这可能会导致混乱的速度非常快。

它将更好地使用 GetKeyboardStateVK_MENU 处理这两个左右 Alt, ,以模仿的行为的IE/Windows Explorer(Vista+)你需要跟踪以前集中的元素存储的焦点,在一个 VK_MENU 按而集中的元素是在你的主菜单。你还想做这工作 PreviewKeyUp (不下降)。

我刚刚碰到这个问题我自己。我试图挂钩到的 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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top