改进WPF ListBox多项目拖拽下降

时间:2015-04-14 08:06:19

标签: c# wpf drag-and-drop listbox

我想实现拖动和放大为扩展选择模式WPF ListBox删除。到目前为止,一切正常:

  1. 我可以为所选项目启动拖动操作
  2. 我可以处理目标
  3. 上的放置操作

    我基本上实现了它as written here - 简而言之:

    1. 处理PreviewMouseLeftButtonDown以存储当前鼠标位置
    2. 如果距离已被覆盖,请处理MouseMove以启动拖动操作
    3. 现在我的问题是:通常,在资源管理器中,我选择要拖动的项目,然后我释放鼠标按钮,再次按下< / strong>发起阻力&amp;放下操作。我猜这是大多数用户会这样做的。当我在我的应用程序中执行相同的操作时,选择更改为项目我第二次按下鼠标按钮 - 多选择已经消失。

      昨天我搜索了很多,但我能找到的所有解决方案都在PreviewMouseLeftButtonDown启动了拖动操作。但是,这不允许我检查鼠标是否已经移动到足以实际启动拖动操作。

      我的问题:有没有人有一个简单的解决方案(不涉及任何第三方库)如何更改上面链接的样本,以便多选择保持不变?

1 个答案:

答案 0 :(得分:3)

问题在于ListBoxListView的选择模式与用于资源管理器的选择模式不同:

对于具有扩展选择模式的ListBox

  

用户只需使用MouseDown取消选择项目;

而对于资源管理器:

  

用户无法仅使用MouseDown取消选择项目,只能在MouseUp之前执行此操作。

这就是为什么在资源管理器中,用户可以选择一个项目,释放鼠标,然后再次按下它以启动拖动&amp;下降。

为了实现类似资源管理器的选择和拖放效果,您需要首先区分MouseDown时是否选择了某个项目,因此当项目IsSelected推迟时,它的选择会发生变化,直到的MouseUp。

您可以查看this article以获取更多想法,以下是您的原型:

private void ListBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if (VisualTreeHelper.GetParent(e.OriginalSource as UIElement) is ListBoxItem)
    {
        ListBoxItem item = (ListBoxItem)VisualTreeHelper.GetParent(e.OriginalSource as UIElement);
        if (item == null) return;
        if (item.IsSelected)
        {
            e.Handled = true;
        }
    }     
}