当我右键单击一个项目时,如何防止 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列表中未选择的右键单击项目?