4

这看起来很容易,但它肯定没有按预期工作。在 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>

窗口的内容需要访问窗口的句柄,所以它是在窗口加载后设置的,如下所示:

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",则焦点变为 null;甚至从未考虑过控制。我试过(评论中的 alpha-mouse 建议):

window.GotKeyboardFocus += delegate { Keyboard.Focus(sadPanda); };

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

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

4

2 回答 2

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。

于 2010-12-18T01:32:08.203 回答
1

在黑客的右侧。您可以Window.GotKeyboardFocus立即集中注意力SadPanda。但可能有更好的解决方案。

于 2010-12-15T11:08:40.557 回答