gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:08:15 24 4
gpt4 key购买 nike

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

  1. 我可以对所选项目发起拖动操作
  2. 我可以处理目标上的放置操作

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

  1. 处理 PreviewMouseLeftButtonDown 以存储当前鼠标位置
  2. 处理 MouseMove 以在距离已覆盖时启动拖动操作

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

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

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

最佳答案

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

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

User can de-select item with just MouseDown;

对于资源管理器:

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

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

为了实现类似 Explorer 的选择和拖放效果,您需要首先区分在 MouseDown 时是否选择了一个项目,因此当一个项目 IsSelected 时,您将推迟它的选择更改,直到 MouseUp。

可以查看this article了解更多想法,这里有一个原型(prototype)供您开始使用:

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

关于c# - 改进 WPF ListBox 多项目拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29622154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com