这似乎很容易,但它绝对不能按预期工作。在WPF 4.0中,我试图创建一个窗口,其中包含一个接受键盘快捷键的菜单栏......只是一个简单的窗口,顶部的菜单栏和其他一些内容(AvalonDock,这可能是问题的一部分)。wpf键盘焦点:菜单打开后失去焦点?
有一个问题:菜单栏&内容位于另一个用户控件(我们称之为SadPanda
,因为它使我成为一只悲伤的熊猫),这是窗口的直接内容。逻辑层次结构看起来是这样的(而不是实际的XAML):
<Window>
<UserControl x:Name="SadPanda" Focusable="True" FocusManager.IsFocusScope="True">
<Grid>
<MenuBar/>
<AvalonDock:DockingManager>
<PandaFood>
</AvalonDock:DockingManager>
</Grid>
</UserControl>
</Window>
窗口的内容需要访问窗口的句柄,所以它的窗口加载这样设置后:
window.Loaded += delegate { window.Content = new SadPanda(); };
菜单栏&快捷方式有路由命令绑定到SadPanda,并且当键盘焦点丢失时,输入手势不再起作用,因此悲伤的熊猫。我添加了这个:
LostKeyboardFocus += (sender, e) => Debug.WriteLine("Lost focus to " + e.NewFocus);
GotKeyboardFocus += (sender, e) => Debug.WriteLine("Got focus from " + e.OldFocus);
...似乎重点是返回到窗口,而不是SadPanda本身。如果我在窗口上设置了Focusable =“False”,则焦点变为空;控制从来没有考虑过。我试图(通过评论的α-鼠标建议):
window.GotKeyboardFocus += delegate { Keyboard.Focus(sadPanda); };
即使这不工作 - 它可以防止开放的菜单(他们闪光灯打开了一秒钟,然后消失),或从曾经获得焦点的文本框......不知道为什么;它似乎是一个完美的解决方案。
基本上,我希望用户控件拥有顶级的键盘焦点,而不是窗口。什么是最简单的方法来实现这一点?
试过了;不起作用; -P。无论出于何种原因,这会导致菜单在打开时立即关闭。 – 2010-12-16 03:45:19