c# – 在什么情况下WPF会将键盘焦点重新放回主窗口?

在我正在研究的
WPF应用程序中,我有一个MenuItem,其中包含两个项目.单击MenuItem时,它将获得键盘焦点并打开其子菜单.再次单击MenuItem时,子菜单将关闭,并且由于某种原因,主窗口将获得键盘焦点.我需要MenuItem来保持焦点.

我被告知在某些其他情况下,主窗口可能会被赋予键盘焦点 – 例如,如果控件具有键盘焦点并且IsEnabled或IsVisible变为false.在哪种情况下会发生这种情况?我一直在谷歌搜索疯狂,但没有找到任何有关这方面的信息.

最佳答案 据我所知,这是预期的行为.默认情况下,WPF菜单是焦点范围,因此菜单中接收焦点的任何控件都不会更改窗口的主要逻辑焦点.

此外,某些WPF控件有时会调用Keyboard.Focus(null); (例如Button在点击时执行此操作).此调用具有将键盘焦点返回到主逻辑焦点的效果.我怀疑菜单关闭时也会发生这种情况.

尝试禁用菜单上的焦点范围:< Menu FocusManager.IsFocusScope =“False”>
当菜单项接收键盘焦点,并且它不在任何焦点范围内时,它将获得主要的逻辑焦点.这意味着Keyboard.Focus(null)调用将把焦点放在菜单项上.但是,这也会阻止子菜单中的命令将焦点返回到非菜单窗口内容,因此路由命令将无法找到其目标.

请参阅“FocusScope设计的内容是什么?”在Using the WPF FocusScope.

点赞