使用ListBox拖动选择

jer*_*lan 5 wpf listview multi-select drag

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*mer 3

当鼠标“拖动”到列表顶部上方或列表底部下方时,您会遇到奇怪的情况。我认为您设置的行为只有在选择模式为“多重”时才能正常工作。下面对 MultiSelectListView 的修改将默认选择模式设置为“多个”,并假设用户希望通过单击鼠标左键开始另一个选择。如果在 XAML 中将 SelectionMode 设置为 Extended 或 Single,您仍然会体验到时髦的感觉。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)