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

问题描述

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

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

起初,我假设网格和列表控件仍在捕获项目选择的修改键的位置,但是在简单控件(如标准按钮)上的上下文菜单中也会出现此问题。

有没有办法解决这个故障?


这是带有wpf应用程序上下文菜单的gif。首先,我正常移动鼠标,然后按下 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中的错误。