2010-06-09 41 views
6

棘手的部分是,每个项目有一个ContextMenu,我仍然想打开它时右键单击(我只是不希望它选择它)。事实上,如果它让事情变得更容易,我根本不需要任何自动选择,所以如果有某种方法,我可以完全禁用它,那就好了。我怎样才能防止列表框选择一个项目,当我右键单击它?

我想只是切换到ItemsControl实际上,只要我能得到虚拟化和滚动来使用它。

回答

16

如果你不想选择我肯定会用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(); 
    } 
} 

仅供参考,这里有一些解决方案,将不随解释工作,所以他们将无法正常工作:

  • 你不能仅仅加上每个数组listB一个的MouseRightButtonDown处理器oxItem因为注册类处理程序将调用你的
  • 您不能在列表框处理的MouseRightButtonDown因为该事件被直接路由到每个控制个别
+0

由于之前 - 我最终会ItemsControl的路线,(实施因为这里http://stackoverflow.com/questions/2783845/wpf-virtualizing-an-itemscontrol)不仅现在它按我的意愿工作,性能也明显增加! – devios1 2010-06-10 19:31:26

相关问题