Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 改进WPF列表框多项目拖放功能&;滴_C#_Wpf_Drag And Drop_Listbox - Fatal编程技术网

C# 改进WPF列表框多项目拖放功能&;滴

C# 改进WPF列表框多项目拖放功能&;滴,c#,wpf,drag-and-drop,listbox,C#,Wpf,Drag And Drop,Listbox,我想为扩展选择模式WPFListBox实现拖放。到目前为止,一切正常: 我可以为所选项目启动拖动操作 我能处理掉目标 我基本上实现了它——简言之: 处理PreviewMouseLeftButtonDown以存储当前鼠标位置 处理MouseMove以在距离已被覆盖时启动拖动操作 现在我的问题是:通常,例如,在资源管理器中,我会选择要拖动的项目,然后我释放鼠标按钮,然后再次按下它来启动拖放操作。我想大多数用户都会这么做。当我现在在我的应用程序中做同样的事情时,选择更改为我第二次按下鼠标按钮的项目-多

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

  • 我可以为所选项目启动拖动操作
  • 我能处理掉目标
  • 我基本上实现了它——简言之:

  • 处理
    PreviewMouseLeftButtonDown
    以存储当前鼠标位置
  • 处理
    MouseMove
    以在距离已被覆盖时启动拖动操作
  • 现在我的问题是:通常,例如,在资源管理器中,我会选择要拖动的项目,然后我释放鼠标按钮,然后再次按下它来启动拖放操作。我想大多数用户都会这么做。当我现在在我的应用程序中做同样的事情时,选择更改为我第二次按下鼠标按钮的项目-多重选择消失了

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


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

    问题是
    列表框
    列表视图
    的选择模式与用于Explorer的模式不同:

    对于具有扩展选择模式的
    列表框

    用户只需鼠标向下即可取消选中项目

    而对于资源管理器:

    用户不能仅使用鼠标向下键取消选择项目,他们只能在鼠标按下之前取消选择项目

    这就是为什么在浏览器中,用户可以选择一个项目,释放鼠标,然后再次按下鼠标开始拖放的核心原因

    为了实现类似浏览器的选择和拖放效果,您需要首先区分鼠标向下时是否选择了某个项目,因此当选择了某个项目
    ,您会将其选择更改推迟到鼠标按下

    您可以查看更多想法,这里有一个原型供您开始:

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