棘手的部分是,每個項目有一個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