首页 > 解决方案 > 按住修饰键时,所有 WPF 上下文菜单似乎都无法正确处理突出显示的项目

问题描述

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

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

起初,我假设网格和列表控件仍在捕获用于项目选择的修饰键,但这个问题也发生在简单控件(如标准按钮)上的上下文菜单中。

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


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

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

标签: c#wpfuser-interfacecontextmenumodifier-key

解决方案


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

由于它是私有的,因此没有适当的方法来解决此问题。但是,如果它很重要,您可以为所有MenuItems 添加一个 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 中的一个错误。


推荐阅读