【问题标题】:Drag-select with ListBox使用 ListBox 拖动选择
【发布时间】:2011-06-15 20:36:08
【问题描述】:

我在 WPF 中有一个 ListView 的简单实现,它允许我通过按住鼠标按钮并拖动项目来选择列表中的多个项目。但是,在按住鼠标按钮的同时,当我将鼠标移到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;
   }
}

【问题讨论】:

    标签: wpf listview drag multi-select


    【解决方案1】:

    当鼠标“拖动”到列表顶部上方或列表底部下方时,您会遇到这种奇怪的情况。我认为您设置的行为只有在选择模式为 Multiple 时才能正常工作。下面对 MultiSelectListView 的修改将默认选择模式设置为 Multiple,并假设用户希望通过鼠标左键单击开始另一个选择。如果在 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      相关资源
      最近更新 更多