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

dev*_*os1 7 .net c# wpf listbox

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

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

我只想切换到一个ItemsControl实际的,只要我可以使用虚拟化和滚动来使用它.

Ray*_*rns 20

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

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

void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e)
{
  e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您希望在ListBox中的其他位置处理鼠标(例如在项目中的控件中),则此操作无效.在这种情况下,最简单的方法可能是将ListBoxItem子类化为忽略它:

public class ListBoxItemNoRightClickSelect : ListBoxItem
{
  protected override void OnMouseRightButtonDown(MouseButtonEventArgs e)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

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

public class ListBoxNoRightClickSelect : ListBox
{
  protected override DependencyObject GetContainerForItemOverride()
  {
    return new ListBoxItemNoRightClickSelect();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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