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

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

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

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

【问题讨论】:

    标签: c# .net wpf listbox


    【解决方案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,因为该事件直接单独路由到每个控件

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多