编程语言
首页 > 编程语言> > C#-改进WPF ListBox多项目拖放

C#-改进WPF ListBox多项目拖放

作者:互联网

我想实施拖放扩展选择模式WPF列表框.到目前为止,一切工作正常:

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

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

>处理PreviewMouseLeftButtonDown以存储当前鼠标位置
>如果已覆盖距离,则处理MouseMove以启动拖动操作

现在我的问题是:通常,例如在资源管理器中,我要选择要拖动的项目,然后释放鼠标按钮,然后再次按下它以启动拖动和放大操作.放下操作.我猜这就是大多数用户会这样做的方式.现在,当我在应用程序中执行相同的操作时,选择更改为第二次按下鼠标按钮的项目-多选消失了.

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

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

解决方法:

问题在于ListBox或ListView的选择模式与用于Explorer的选择模式不同:

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

User can de-select item with just MouseDown;

而对于资源管理器:

User can not de-select item with just MouseDown, they can only do it until MouseUp.

因此,这就是为什么在资源管理器中用户可以选择一个项目,释放鼠标,然后再次按它以开始拖动和拖动的核心原因.下降.

为了实现类似资源管理器的选择和拖放效果,您需要首先区分在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;
        }
    }     
}

标签:drag-and-drop,listbox,wpf,c
来源: https://codeday.me/bug/20191120/2044353.html