C# wpf键盘焦点:菜单打开后失去焦点?

C# wpf键盘焦点:菜单打开后失去焦点?,c#,wpf,focus,keyboard-shortcuts,wpf-4.0,C#,Wpf,Focus,Keyboard Shortcuts,Wpf 4.0,这看起来很容易,但肯定没有达到预期效果。在WPF4.0中,我试图创建一个带有菜单栏的窗口,该菜单栏接受键盘快捷键。。。只是一个简单的窗口,顶部的菜单栏,以及一些其他东西(内部,这可能是问题的一部分) 有一个缺点:菜单栏和内容在另一个用户控件中(我们称它为SadPanda,因为它让我变成了一只悲伤的熊猫),这是窗口的直接内容。逻辑层次结构如下所示(不是实际的XAML): 菜单栏和快捷键具有绑定到sad panda的路由命令,当键盘焦点丢失时,输入手势不再工作,因此sad panda。我补充说: L

这看起来很容易,但肯定没有达到预期效果。在WPF4.0中,我试图创建一个带有菜单栏的窗口,该菜单栏接受键盘快捷键。。。只是一个简单的窗口,顶部的菜单栏,以及一些其他东西(内部,这可能是问题的一部分)

有一个缺点:菜单栏和内容在另一个用户控件中(我们称它为
SadPanda
,因为它让我变成了一只悲伤的熊猫),这是窗口的直接内容。逻辑层次结构如下所示(不是实际的XAML):

菜单栏和快捷键具有绑定到sad panda的路由命令,当键盘焦点丢失时,输入手势不再工作,因此sad panda。我补充说:

LostKeyboardFocus += (sender, e) => Debug.WriteLine("Lost focus to " + e.NewFocus);
GotKeyboardFocus += (sender, e) => Debug.WriteLine("Got focus from " + e.OldFocus);
。。。看来焦点又回到了窗口,而不是熊猫本身。如果在窗口上设置Focusable=“False”,则焦点将变为null;控制甚至从未被考虑过。我尝试过(由alpha鼠标在评论中建议):

即使这样也不起作用——它会阻止菜单打开(它们闪烁打开一秒钟,然后消失),或者阻止文本框获得焦点。。。不知道为什么;这似乎是一个完美的解决方案


基本上,我希望用户控件具有顶级键盘焦点,而不是窗口。实现这一点最简单的方法是什么?

在黑客的右边。您可以处理
Window.GotKeyboardFocus
以立即聚焦
SadPanda
。但是可能有更好的解决方案。

我仍然不知道为什么这样做有效,但我找到了以下解决方案:

  • 窗口上设置
    Focusable=“False”
    FocusManager.IsFocusScope=“False”
  • 在控件上设置
    Focusable=“True”
    FocusManager.IsFocusScope=“True”
  • 三个。使用以下命令:

    PleasedPanda.LostKeyboardFocus += (sender, e) =>
    {
        if(e.NewFocus == null)
        {
            Keyboard.Focus(PleasedPanda);
        }
    }
    

    我不知道为什么这样做有效,而更明显的
    窗口。GotKeyboardFocus
    不起作用,但这是WPF为您准备的;不起作用-P.无论出于何种原因,这会导致菜单一打开就立即关闭。
    LostKeyboardFocus += (sender, e) => Debug.WriteLine("Lost focus to " + e.NewFocus);
    GotKeyboardFocus += (sender, e) => Debug.WriteLine("Got focus from " + e.OldFocus);
    
    window.GotKeyboardFocus += delegate { Keyboard.Focus(sadPanda); };
    
    PleasedPanda.LostKeyboardFocus += (sender, e) =>
    {
        if(e.NewFocus == null)
        {
            Keyboard.Focus(PleasedPanda);
        }
    }