当我右键单击ListBox时,我该如何防止其选择项目?

12 浏览
0 Comments

当我右键单击ListBox时,我该如何防止其选择项目?

问题在于每个项目都有一个右键单击时我仍然希望打开的上下文菜单(我只是不想选择它)。

实际上,如果有什么简化的方法,我根本不想自动选择任何项目,所以如果有办法完全禁用它,那就太好了。

我正在考虑切换到一个ItemsControl,只要我能够使虚拟化和滚动与之一起工作。

0
0 Comments

问题的原因是当在ListBox上右键单击时,会自动选择一个项目。解决方法是通过处理PreviewRightMouseButtonDown事件来阻止选择。代码如下:

void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e)
{
  e.Handled = true;
}

这段代码的原理是,ListBoxItem的选择是在鼠标按下时发生的,而上下文菜单的打开是在鼠标抬起时发生的。因此,在预览阶段消除鼠标按下事件可以解决这个问题。

然而,如果希望在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事件,因为该事件直接路由到每个控件。

最后,通过使用ItemsControl来解决问题,并且性能也有显著提高。

0