2011-06-15 61 views
5

我在WPF中有一個簡單的實現ListView,允許我通過按住鼠標按鈕並拖動項目來選擇列表中的多個項目。但是,在按住鼠標按鈕的同時,將鼠標移動到ListView之外時,選擇會發生一些奇怪的情況。理想情況下,我只想讓選擇保持不變,但是它會快速循環所有選定的項目,只留下最後選擇的項目。用列表框拖動選擇

這是代碼,有什麼想法?

public class MultiSelectListView : ListView 
{ 
    private bool m_isSelectionActive; 

    public bool IsSelectionActive 
    { 
     get { return m_isSelectionActive; } 
    } 

    protected override DependencyObject GetContainerForItemOverride() 
    { 
     return new MultiSelectListViewItem(this); 
    } 

    protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     m_isSelectionActive = true; 
    } 

    protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
     m_isSelectionActive = false; 
    } 
} 

public class MultiSelectListViewItem : ListViewItem 
{ 
    private readonly MultiSelectListView m_parent; 

    public MultiSelectListViewItem(MultiSelectListView parent) 
    { 
     m_parent = parent; 
    } 

    protected override void OnMouseEnter(System.Windows.Input.MouseEventArgs e) 
    { 
     if (m_parent.IsSelectionActive) 
     IsSelected = true; 
    } 
} 

回答

3

當鼠標「拖拽」高於列表頂部或低於列表底部時,發生的怯懦發生。我認爲,如果選擇模式爲「多個」,則您設置的行爲將僅適用。下面對MultiSelectListView的修改將默認選擇模式設置爲Multiple,並假設用戶想要通過單擊鼠標左鍵開始另一個選擇。如果SelectionMode在XAML中設置爲「擴展」或「單個」,您仍然會感到不適。

public class MultiSelectListView : ListView 
{ 
    private bool m_isSelectionActive; 
    public bool IsSelectionActive 
    { 
     get 
     { 
      return m_isSelectionActive; 
     } 
    } 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
     return new MultiSelectListViewItem(this); 
    } 
    protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     if (SelectionMode != SelectionMode.Single) 
     { 
      SelectedItems.Clear(); 
     } 
     m_isSelectionActive = true; 
    } 
    protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
     m_isSelectionActive = false; 
    } 
    public MultiSelectListView() : base() 
    { 
     SelectionMode = SelectionMode.Multiple; 
    } 
}