C# wpf键盘焦点:菜单打开后失去焦点?
这看起来很容易,但肯定没有达到预期效果。在WPF4.0中,我试图创建一个带有菜单栏的窗口,该菜单栏接受键盘快捷键。。。只是一个简单的窗口,顶部的菜单栏,以及一些其他东西(内部,这可能是问题的一部分) 有一个缺点:菜单栏和内容在另一个用户控件中(我们称它为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
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);
}
}