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

时间:2010-06-09 23:30:50

标签: c# .net wpf listbox

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

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

我正在考虑切换到ItemsControl实际上,只要我可以使用虚拟化并滚动使用它。

1 个答案:

答案 0 :(得分:19)

如果你根本不想选择我肯定会使用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中显式构造这些ListBoxItems,也可以将ListBox子类化为自动使用自定义项目:

public class ListBoxNoRightClickSelect : ListBox
{
  protected override DependencyObject GetContainerForItemOverride()
  {
    return new ListBoxItemNoRightClickSelect();
  }
}

仅供参考,这里有一些解决方案不能解释为什么它们不起作用:

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