【发布时间】:2011-05-25 18:40:46
【问题描述】:
这看起来很简单,但肯定没有按预期工作。在 WPF 4.0 中,我正在尝试创建一个带有接受键盘快捷键的菜单栏的窗口......只是一个简单的窗口、顶部的菜单栏和其他一些东西(在 AvalonDock 内,这可能是问题)。
有一个问题:菜单栏和内容在另一个用户控件中(我们称之为SadPanda,因为它让我变成了一只悲伤的熊猫),这是窗口的直接内容。逻辑层次结构看起来像这样(不是实际的 XAML):
<Window>
<UserControl x:Name="SadPanda" Focusable="True" FocusManager.IsFocusScope="True">
<Grid>
<MenuBar/>
<AvalonDock:DockingManager>
<PandaFood>
</AvalonDock:DockingManager>
</Grid>
</UserControl>
</Window>
窗口的内容需要访问窗口的Handle,所以在窗口加载后设置如下:
window.Loaded += delegate { window.Content = new SadPanda(); };
菜单栏和快捷键有绑定到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",则焦点变为 null;甚至从未考虑过控制。我试过了(由 cmets 中的 alpha-mouse 建议):
window.GotKeyboardFocus += delegate { Keyboard.Focus(sadPanda); };
即使这样也不起作用 - 它会阻止菜单打开(它们会闪烁打开一秒钟,然后消失)或文本框无法获得焦点......不知道为什么;这似乎是完美的解决方案。
基本上,我希望用户控件具有顶级键盘焦点,而不是窗口。实现这一目标的最简单方法是什么?
【问题讨论】:
标签: c# wpf focus keyboard-shortcuts wpf-4.0