2010-06-09 40 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

相關問題