当按住修改键时,所有 WPF 上下文菜单似乎都无法正确处理突出显示的项目

All WPF context menus do not seem to handle highlighting items properly when a modifier key is held down

它发生在我所有的 WPF 应用程序中,Visual Studio 2019(绝对是基于 WPF 的)也表现出这种奇怪的行为:

只需在按住 Control 键的同时右键单击解决方案资源管理器中的某个项目,您就会注意到,如果您一直按住 Control 键,项目突出显示会间歇性地起作用。

起初我假设网格和列表控件仍在捕捉项目选择的修改键,但这个问题也出现在像标准按钮这样的简单控件上的上下文菜单中。

有没有办法解决这个问题?


这是一个 gif 动图,其中包含 wpf 应用程序上下文菜单。首先我正常移动鼠标,然后用 Ctrl 按住:

如您所见,它出现了故障(没有突出显示菜单项)。

MenuItem 在按下某个键时设置一个内部标志,该标志会暂时停止注册鼠标事件,而不管它是否实际上是一个执行导航的键。这反映了我看到的行为,即当我按住 any 键时,选择会断断续续,而不仅仅是修饰符。 https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/windows/Controls/MenuItem.cs,2049

由于它是私有的,所以没有正确的方法来解决这个问题。但是,如果它很重要,您可以为所有 MenuItem 添加一个 KeyDown 处理程序,然后使用反射

更改它
var menu = sender as MenuItem;
if (menu != null)
{
    var parent = ItemsControl.ItemsControlFromItemContainer(menu);
    MethodInfo setBoolField = menu.GetType().GetMethod("SetBoolField",
        BindingFlags.NonPublic | BindingFlags.Static);
    setBoolField.Invoke(this, new object[] { parent, 0x04, false });
}

如果需要,您可以先检查该键是否为导航键以保留所需的行为。

我个人认为这是 WPF 中的一个错误。