Перетаскивание с помощью ListBox - PullRequest
5 голосов
/ 16 июня 2011

У меня есть простая реализация ListView в WPF, которая позволяет мне выбирать несколько элементов в списке, удерживая кнопку мыши и перетаскивая элементы. Однако, удерживая кнопку мыши нажатой, когда я перемещаю мышь за пределы 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;
   }
}

1 Ответ

3 голосов
/ 18 июля 2011

Бесполезность, с которой вы сталкиваетесь, возникает, когда «перетаскивание» мыши идет над верхней частью списка или под нижней частью списка.Я думаю, что настроенное вами поведение будет хорошо работать, только если выбран режим множественного выбора.Изменения в MultiSelectListView ниже устанавливают режим выбора по умолчанию на «Несколько» и предполагают, что пользователь хочет начать другой выбор с помощью щелчка левой кнопкой мыши.Вы по-прежнему будете испытывать фанки, если для 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;
    }
}
...