2011-06-15 13 views
5

Tengo una implementación simple de ListView en WPF que me permite seleccionar varios elementos de la lista manteniendo presionado el botón del mouse y arrastrando los elementos. Sin embargo, mientras mantiene presionado el botón del mouse, cuando muevo el mouse fuera del ListView, sucede algo extraño con la selección. Idealmente, solo me gustaría que la selección siga siendo la misma, pero en lugar de eso, recorre rápidamente todos los elementos seleccionados, dejando solo el último elemento seleccionado.Arrastrar y seleccionar con ListBox

Aquí está el código, ¿tiene alguna idea?

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

Respuesta

3

La peculiaridad que está experimentando sucede cuando el ratón "arrastre" pasa por encima de la parte superior de la lista o por debajo de la parte inferior de la lista. Creo que el comportamiento que configuras solo funcionará bien si el modo de selección es Múltiple. Las modificaciones al MultiSelectListView a continuación establecen el modo de selección predeterminado en Múltiple y asume que el usuario desea iniciar otra selección con un clic con el botón izquierdo del mouse. Todavía experimentará funkiness si el SelectionMode está configurado en Extended o Single en el 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; 
    } 
}