【问题标题】:All WPF context menus do not seem to handle highlighting items properly when a modifier key is held down按住修饰键时,所有 WPF 上下文菜单似乎都无法正确处理突出显示的项目
【发布时间】:2021-01-09 11:58:09
【问题描述】:

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

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

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

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


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

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

【问题讨论】:

  • 上下文菜单由 Windows 提供,而不是 WPF。按下 Ctrl 时我没有看到任何区别。
  • 持有 Ctrl 并查看我的 wpf 应用程序中的上下文菜单,我可以确认菜单项可以在没有突出显示的情况下被鼠标悬停,这看起来很难看。我不知道,因为在使用菜单时我永远不会持有CtrAlt 将关闭菜单。 Shift 有同样的问题。为什么需要菜单修饰符?改为创建 2 个菜单项。
  • 感谢您发布显示问题的 gif。我很高兴我不是唯一一个看到它发生的人。我需要为更高级的用户提供带有特殊命令的第二个菜单。在我看来,右键单击时按下修饰键并不是一个不合理的期望。
  • 在我看来,在右键单击时按下修饰键并不是一个不合理的期望。 不确定这是否正确。您通常有两种用户,他们要么专注于键盘,要么专注于鼠标。在绘图或缩放时,您可以组合这两种类型的输入,但是将这种组​​合行为强加给高级用户对用户来说不是很友好。最好根据用户的级别(初级高级)来定义菜单项。例如,通过设置或商业计划(社区 专业)。
  • 我也可以使用基本的Menu 控件重现有趣的行为。当您按住 CtrlShift 键时,您无法可靠地在主菜单标题之间切换。我碰巧同意@Funk 和@Sinatr,但在上下文菜单上使用修饰键似乎不是与 UI 交互的正常方式。

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


【解决方案1】:

MenuItem 会在按下某个键时设置一个内部标志,以暂时停止注册鼠标事件,无论它是否实际上是执行导航的键。这反映了我看到的行为,即当我按住 any 键时,选择会卡顿,而不仅仅是修饰符。 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 中的一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多