2011-06-15 21 views
5

के साथ ड्रैग-सिलेक्ट करें मेरे पास WPF में ListView का एक सरल कार्यान्वयन है जो मुझे माउस बटन दबाकर और आइटम पर खींचकर सूची में एकाधिक आइटम चुनने की अनुमति देता है। हालांकि, माउस बटन को दबाकर, जब मैं माउस को ListView के बाहर ले जाता हूं, तो चयन के साथ कुछ अजीब होता है। आदर्श रूप से, मैं सिर्फ चयन को वही रहना चाहता हूं, लेकिन इसके बजाय यह सभी चयनित वस्तुओं के माध्यम से जल्दी से चक्र चलाता है, केवल चयनित अंतिम आइटम को छोड़ देता है।ListBox

यहां कोड है, कोई विचार है?

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

funkiness आप अनुभव कर रहे होता है जब माउस "खींचें" सूची में सबसे ऊपर के ऊपर या सूची में सबसे नीचे नीचे चला जाता है। मुझे लगता है कि आपके द्वारा स्थापित व्यवहार केवल तभी काम करेगा जब चयन मोड एकाधिक हो। नीचे MultiSelectListView में संशोधन डिफ़ॉल्ट चयन मोड को एकाधिक पर सेट करते हैं और मानते हैं कि उपयोगकर्ता बाएं माउस क्लिक के साथ एक और चयन शुरू करना चाहता है। यदि चयन मोड को एक्सएएमएल में विस्तारित या सिंगल पर सेट किया गया है तो भी आपको मज़ाकिया अनुभव होगा।

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; 
    } 
} 
संबंधित मुद्दे