gpt4 book ai didi

c# - wpf 键盘焦点 : losing focus after menu opens?

转载 作者:太空狗 更新时间:2023-10-30 01:26:38 25 4
gpt4 key购买 nike

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

菜单栏和快捷方式具有绑定(bind)到 SadPanda 的路由命令,当键盘焦点丢失时,输入手势将不再有效,因此会出现 sad panda。我添加了这个:

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

... 似乎焦点又回到了 Window,而不是 SadPanda 本身。如果我在窗口上设置 Focusable="False",则焦点变为空;甚至从未考虑过控制。我试过了(在评论中由 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。

关于c# - wpf 键盘焦点 : losing focus after menu opens?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4447929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com