拖动选择与列表框 [英] Drag-select with ListBox

查看:211
本文介绍了拖动选择与列表框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的实施的ListView 在WPF的,让我通过按住鼠标左键并拖动过的项目在列表中选择多个项目。然而,同时按住鼠标按钮,当我移动之外的ListView鼠标,一些奇怪的事情发生与选择。理想情况下,我只是想选择保持不变,但选择的,而不是它迅速循环通过所有选定的项目,只剩下最后一个项目。

这里的code,有什么想法?

 公共类MultiSelectListView:ListView控件
{
   私人布尔m_isSelectionActive;   公共BOOL IsSelectionActive
   {
      {返回m_isSelectionActive; }
   }   保护覆盖的DependencyObject GetContainerForItemOverride()
   {
      返回新MultiSelectListViewItem(本);
   }   保护覆盖无效在previewMouseLeftButtonDown(MouseButtonEventArgs E)
   {
      m_isSelectionActive = TRUE;
   }   保护覆盖无效在previewMouseLeftButtonUp(MouseButtonEventArgs E)
   {
      m_isSelectionActive = FALSE;
   }
}公共类MultiSelectListViewItem:ListViewItem的
{
   私人只读MultiSelectListView m_parent;   公共MultiSelectListViewItem(MultiSelectListView父)
   {
      m_parent =父母;
   }   保护覆盖无效OnMouseEnter在(System.Windows.Input.MouseEventArgs E)
   {
      如果(m_parent.IsSelectionActive)
         IsSelected = TRUE;
   }
}


解决方案

您所遇到的funkiness发生在鼠标拖云上面列表的顶部或下面的列表的底部。我认为,如果选择模式是多你设置的行为只会工作。下面的MultiSelectListView的修改设置默认的选择模式到多个并假定用户要开始用鼠标左键点击其他选择。如果selectionMode是设置在XAML扩展或单一您将仍然遇到funkiness。

 公共类MultiSelectListView:ListView控件
{
    私人布尔m_isSelectionActive;
    公共BOOL IsSelectionActive
    {
        得到
        {
            返回m_isSelectionActive;
        }
    }
    保护覆盖的DependencyObject GetContainerForItemOverride()
    {
        返回新MultiSelectListViewItem(本);
    }
    保护覆盖无效在previewMouseLeftButtonDown(MouseButtonEventArgs E)
    {
        如果(的SelectionMode!= SelectionMode.Single)
        {
            SelectedItems.Clear();
        }
        m_isSelectionActive = TRUE;
    }
    保护覆盖无效在previewMouseLeftButtonUp(MouseButtonEventArgs E)
    {
        m_isSelectionActive = FALSE;
    }
    公共MultiSelectListView():基地()
    {
        的SelectionMode = SelectionMode.Multiple;
    }
}

I have a simple implementation of a ListView in WPF that allows me to select multiple items in the list by holding the mouse button and dragging over the items. However, while holding the mouse button down, when I move the mouse outside the ListView, something strange happens with the selection. Ideally, I would just want the selection to remain the same, but instead it quickly cycles through all the selected items, leaving only the last item selected.

Here's the code, have any ideas?

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

解决方案

The funkiness you are experiencing happens when the mouse "drag" goes above the top of the list or below the bottom of the list. I think the behavior you set up will only work well if the selection mode is Multiple. The modifications to the MultiSelectListView below set the default selection mode to Multiple and assumes the user wants to start another selection with a left mouse click. You will still experience funkiness if the SelectionMode is set to Extended or Single in the 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;
    }
}

这篇关于拖动选择与列表框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆