繁体   English   中英

wpf键盘焦点:菜单打开后失去焦点?

[英]wpf keyboard focus: losing focus after menu opens?

这似乎很容易,但它绝对没有按预期工作。 在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的路由命令 ,当键盘焦点丢失时,输入手势不再起作用,因此悲伤的熊猫。 我补充说:

LostKeyboardFocus += (sender, e) => Debug.WriteLine("Lost focus to " + e.NewFocus);
GotKeyboardFocus += (sender, e) => Debug.WriteLine("Got focus from " + e.OldFocus);

...似乎重点是回到Window,而不是SadPanda本身。 如果我在窗口上设置Focusable =“False”,则焦点变为null; 甚至从未考虑过控制。 我尝试过(在评论中由alpha-mouse建议):

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

即便这样也行不通 - 它会阻止菜单打开(它们会一秒钟闪开,然后消失)或文本框变得焦点......不知道为什么; 它似乎是完美的解决方案。

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

我仍然不确定为什么会这样,但这是我找到的解决方案:

  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。

在黑客的右边。 您可以处理Window.GotKeyboardFocus以立即聚焦SadPanda 但可能有更好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM