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

标签 c# wpf user-interface contextmenu modifier-key

它发生在我所有的 WPF 应用程序中,Visual Studio 2019(绝对基于 WPF)也表现出这种奇怪的行为:
只需在解决方案资源管理器中右键单击一个项目,同时按住 Control 键,您应该注意到,如果您继续按住 Control 修饰符,突出显示的项目将间歇性地工作。
起初,我认为网格和列表控件仍在捕获用于项目选择的修饰键,但这个问题也发生在简单控件(如标准按钮)上的上下文菜单中。
有没有办法解决这个故障?

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

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

最佳答案

MenuItem 会在按下某个键时设置一个内部标志,以暂时停止注册鼠标事件,无论它是否实际上是执行导航的键。这反射(reflect)了我看到的行为,即当我按住任何键时,选择会卡顿,而不仅仅是修饰符。 https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/windows/Controls/MenuItem.cs,2049
由于它是私有(private)的,因此没有适当的方法来解决此问题。但是,如果它很重要,您可以为所有 MenuItem 添加一个 KeyDown 处理程序。 s 然后用反射改变它

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 中的一个错误。

关于c# - 按住修饰键时,所有 WPF 上下文菜单似乎都无法正确处理突出显示的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64025310/

相关文章:

wpf - wpf中开/关关闭/打开等状态的最简单表示是什么?

c# - 错误 CS0246 : The type or namespace name 'StreamingContext' could not be found (are you missing a using directive or an assembly reference?)

c# - WPF 3D - 应用转换,更改基础对象值

c# - 顺序验证

wpf - 实现诸如MVC或MVVM的架构模式是否为时已晚?

java - 在 x-z 平面中翻转 gui 组件

iOS:如何决定何时绘制 UIView?

css - 更改 IE 浏览器的布局

c# - 创建可以绑定(bind)到 DataGrid 的自定义集合

c# - 逐字节比较两个字节数组并返回有区别吗?