棘手的部分是每个项目都有一个ContextMenu
,当我右键单击时我仍然要打开它(我只是不想让它选择它)。
事实上,如果它让事情变得更容易,我根本不想要任何自动选择,所以如果有某些方法我可以完全禁用它,那就没事了。
我正在考虑切换到ItemsControl
实际上,只要我可以使用虚拟化并滚动使用它。
答案 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();
}
}
仅供参考,这里有一些解决方案不能解释为什么它们不起作用: