2011-06-15 16 views
5

WPF'de ListView'un basit bir uygulamasına sahibim; bu, fare düğmesini basılı tutarak ve öğeleri sürükleyerek listede birden fazla öğe seçmeme izin veriyor. Ancak, fare düğmesini basılı tutarken, fareyi ListView'un dışına taşıdığımda, seçim ile garip bir şey olur. İdeal olarak, sadece seçimin aynı kalmasını isterdim, ancak bunun yerine, seçilen son öğeyi hızla seçerek, yalnızca seçilen son öğeyi bırakır.ListBox ile sürükleme seçimi

İşte kod, herhangi bir fikrin var mı? Fare "sürükle" listenin en üstünde veya listenin alt altına gittiğinde

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; 
    } 
} 

cevap

3

karşılaştığınız funkiness olur. Ayarladığınız davranışın sadece seçim modu Çoklu ise, iyi çalışacağını düşünüyorum. Aşağıdaki MultiSelectListView'daki değişiklikler varsayılan seçim modunu Çoklu olarak ayarlar ve kullanıcının bir sol fare tıklamasıyla başka bir seçim başlatmak istediğini varsayar. SelectionMode, XAML'de Genişletilmiş veya Tek olarak ayarlanmışsa, yine de eğlencelilık yaşarsınız.

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; 
    } 
}