c# - 按住修饰键时,所有 WPF 上下文菜单似乎都无法正确处理突出显示的项目
问题描述
它发生在我所有的 WPF 应用程序中,Visual Studio 2019(绝对基于 WPF)也表现出这种奇怪的行为:
只需在解决方案资源管理器中右键单击一个项目,同时按住 Control 键,您应该注意到,如果您继续按住 Control 修饰符,突出显示的项目将间歇性地工作。
起初,我假设网格和列表控件仍在捕获用于项目选择的修饰键,但这个问题也发生在简单控件(如标准按钮)上的上下文菜单中。
有没有办法解决这个故障?
这是一个带有 wpf 应用程序上下文菜单的 gif。首先我正常移动鼠标,然后Ctrl按住:
如您所见,它出现故障(未突出显示菜单项)。
解决方案
MenuItem 会在按下某个键时设置一个内部标志,以暂时停止注册鼠标事件,无论它是否实际上是执行导航的键。这反映了我看到的行为,即当我按住任何键时,选择会卡顿,而不仅仅是修饰符。https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/windows/Controls/MenuItem.cs,2049
由于它是私有的,因此没有适当的方法来解决此问题。但是,如果它很重要,您可以为所有MenuItem
s 添加一个 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 中的一个错误。
推荐阅读
- r - 在 Shiny 中显示静态 html 表时出现意外结果
- c# - C# - 查询有关使用编辑按钮从 DataGrid 更新记录
- c# - 在 Visual Studio 中隐藏导航栏
- php - 如何使用 tc-lib-barcode 指定“X 维度”和“Y 维度”等参数
- c# - 如何在按钮上实现一个按钮,通过相同的点击删除父项和子项,而不需要父项可点击?(统一)
- nativescript - 从 NativeScript vue iOS 中的电子邮件链接打开应用程序
- formula - 有没有办法使用公式字段引用相关记录上的字段中包含的数据?
- typescript - 如何在 Typescript 中映射可能为空的数组
- java - 如何删除 GridLayout 组合中的行之间的间距?
- javascript - 球从中心而不是边缘反弹