2010-12-15 157 views
4

这似乎很容易,但它绝对不能按预期工作。在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); }; 

即使这不工作 - 它可以防止开放的菜单(他们闪光灯打开了一秒钟,然后消失),或从曾经获得焦点的文本框......不知道为什么;它似乎是一个完美的解决方案。

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

回答

3

我仍然不知道为什么这个工程,但这里我找到了解决方案:窗口

  1. Focusable="False"FocusManager.IsFocusScope="False"
  2. 设置Focusable="True"FocusManager.IsFocusScope="True"上的控件。

三。使用以下命令:

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

我不知道为什么这个工程而更加明显window.GotKeyboardFocus没有,但那是WPF为您服务。

1

在黑客的权利。您可以处理Window.GotKeyboardFocus以立即关注SadPanda。但可能有更好的解决方案。

+0

试过了;不起作用; -P。无论出于何种原因,这会导致菜单在打开时立即关闭。 – 2010-12-16 03:45:19