棘手的部分是,每个项目有一个ContextMenu
,我仍然想打开它时右键单击(我只是不希望它选择它)。事实上,如果它让事情变得更容易,我根本不需要任何自动选择,所以如果有某种方法,我可以完全禁用它,那就好了。我怎样才能防止列表框选择一个项目,当我右键单击它?
我想只是切换到ItemsControl
实际上,只要我能得到虚拟化和滚动来使用它。
棘手的部分是,每个项目有一个ContextMenu
,我仍然想打开它时右键单击(我只是不希望它选择它)。事实上,如果它让事情变得更容易,我根本不需要任何自动选择,所以如果有某种方法,我可以完全禁用它,那就好了。我怎样才能防止列表框选择一个项目,当我右键单击它?
我想只是切换到ItemsControl
实际上,只要我能得到虚拟化和滚动来使用它。
如果你不想选择我肯定会用ItemsControl而不是ListBox。只要它们在模板中,虚拟化和滚动都可以与简单的ItemsControl一起使用。
在另一方面,如果你需要选择,但只是不想右键来选择,最简单的方法可能是处理PreviewRightMouseButtonDown事件:
void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
}
这部作品的原因是一个ListBoxItem选择发生在鼠标上下来但上下文菜单打开发生在鼠标上up。因此,在预览阶段消除鼠标停止事件可解决您的问题。
但是,如果您希望在列表框中的其他位置处理鼠标(例如在项目内的某个控件中),则此功能无效。在这种情况下,最简单的方法可能是继承ListBoxItem的忽略它:
public class ListBoxItemNoRightClickSelect : ListBoxItem
{
protected override void OnMouseRightButtonDown(MouseButtonEventArgs e)
{
}
}
你可以明确地建立在你的ItemsSource这些ListBoxItems或者你也可以子类列表框自动地使用您的自定义项目:
public class ListBoxNoRightClickSelect : ListBox
{
protected override DependencyObject GetContainerForItemOverride()
{
return new ListBoxItemNoRightClickSelect();
}
}
仅供参考,这里有一些解决方案,将不随解释工作,所以他们将无法正常工作:
由于之前 - 我最终会ItemsControl的路线,(实施因为这里http://stackoverflow.com/questions/2783845/wpf-virtualizing-an-itemscontrol)不仅现在它按我的意愿工作,性能也明显增加! – devios1 2010-06-10 19:31:26