当我右键单击一个项目时,如何防止 ListBox 选择它?

Posted

技术标签:

【中文标题】当我右键单击一个项目时,如何防止 ListBox 选择它?【英文标题】:How can I prevent ListBox from selecting an item when I right-click it? 【发布时间】:2022-01-09 22:39:21 【问题描述】:

棘手的部分是每个项目都有一个ContextMenu,当它被右键单击时我仍然想打开它(我只是不想让它选择它)。

事实上,如果它使事情变得更容易,我根本不想要 任何 自动选择,所以如果有某种方法可以完全禁用它,那很好。

实际上,我正在考虑切换到 ItemsControl,只要我可以进行虚拟化和滚动操作即可。

【问题讨论】:

【参考方案1】:

如果您根本不想选择,我肯定会选择 ItemsControl 而不是 ListBox。虚拟化和滚动都可以与普通的 ItemsControl 一起使用,只要它们在模板中即可。

另一方面,如果您需要选择但又不想右键单击选择,最简单的方法可能是处理 PreviewRightMouseButtonDown 事件:

void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e)

  e.Handled = true;

这样做的原因是 ListBoxItem 选择发生在鼠标 down 上,但上下文菜单打开发生在鼠标 up 上。因此,在预览阶段消除鼠标按下事件可以解决您的问题。

但是,如果您希望在 ListBox 中的其他位置(例如在项目中的控件中)处理鼠标按下,则此方法不起作用。在这种情况下,最简单的方法可能是继承 ListBoxItem 以忽略它:

public class ListBoxItemNoRightClickSelect : ListBoxItem

  protected override void OnMouseRightButtonDown(MouseButtonEventArgs e)
  
  

您可以在 ItemsSource 中显式构造这些 ListBoxItem,也可以将 ListBox 子类化以自动使用您的自定义项:

public class ListBoxNoRightClickSelect : ListBox

  protected override DependencyObject GetContainerForItemOverride()
  
    return new ListBoxItemNoRightClickSelect();
  

仅供参考,以下是一些不起作用的解决方案以及它们不起作用的解释:

您不能只在每个 ListBoxItem 上添加 MouseRightButtonDown 处理程序,因为已注册的类处理程序将在您之前调用 您无法在 ListBox 上处理 MouseRightButtonDown,因为该事件直接单独路由到每个控件

【讨论】:

谢谢——我最终选择了 ItemsControl 路线,(在此处实现 ***.com/questions/2783845/…)不仅现在可以按我的意愿工作,而且性能也显着提高了!

以上是关于当我右键单击一个项目时,如何防止 ListBox 选择它?的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何获取Java Swing列表中未选择的右键单击项目?

如何在 ReactJS 中检查事件目标的类名?

当我单击另存为 HTML 而不是右键单击浏览器并保存时,如何将 React 单页保存为 HTML

JList 右键单击​​显示菜单(使用、删除、取消)

Chrome 在刷新后更改样式并在我右键单击检查时更正它

仅允许在 ListBox 中右键单击来选择项目