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