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

本文关键字:焦点 窗口 键盘 情况下 WPF 在什么 | 更新日期: 2023-09-27 18:27:47

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

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

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

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

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

请参阅使用WPF FocusScope中的"为FocusScope设计了什么?"。