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

时间:2014-10-23 21:27:09

标签: c# wpf focus

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

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

1 个答案:

答案 0 :(得分:2)

据我所知,这是预期的行为。默认情况下,WPF菜单是焦点范围,因此菜单中接收焦点的任何控件都不会更改窗口的主要逻辑焦点。 此外,某些WPF控件有时会调用Keyboard.Focus(null);(例如Button在点击时执行此操作)。此调用具有将键盘焦点返回到主逻辑焦点的效果。我怀疑当菜单关闭时也会发生这种情况。

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

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