winforms 调用DoDragDrop方法后执行拖放实现

g6ll5ycj  于 2023-02-13  发布在  其他
关注(0)|答案(3)|浏览(185)

我已经纠结了很久了
我的应用程序包含一个列表视图,其中填充了位于服务器上的文件名。
我正在尝试实现拖放功能,以便用户可以将文件从我的应用程序拖到他/她的本地计算机中。
为此,我首先将文件下载到一个临时位置,然后调用应用程序的DoDragDrop()方法。
问题是我只想在调用DoDragDrop方法之后执行下载过程。
我尝试了与拖放方法相关的每个事件(GiveFeedback、ItemDrag等),但没有任何效果
因此,基本上我需要的是一个在DoDragDrop完成后引发的事件
有什么主意吗?

slsn1g29

slsn1g291#

不知道如何在. NET中实现这一点,但在常规Win32编程中,实现IDataObject接口的对象也可以选择性地实现IAsyncOperation接口。然后IDropTarget可以使用该接口在后台线程中执行拖放操作,以便源和目标在实际传输过程中不会被阻塞。唯一的问题是目标(而不是源)决定是否利用这一点。
另一种方法是使用"优化移动"传输,其中IDataObject提供文件名,IDropTarget直接移动文件。
MSDN对此有详细说明:Handling Shell Data Transfer Scenarios.
当然,这仍然意味着您必须在开始拖放之前下载文件。确实没有办法执行拖放来确定目标,然后再执行下载。不过,您可以做的是让IDataObject保存CFSTR_FILEDESCRIPTORCFSTR_FILECONTENTS条目(如下所述:Shell Clipboard Formats),其中CFSTR_FILEDESCRIPTOR是根据您用于填充ListView的信息填充的,CFSTR_FILECONTENTS使用IStream接口,这些接口的实现在实际放置操作期间而不是之前执行下载。至少这样,您只下载目标真正需要的文件,并可以跳过其余部分。
将其与IAsyncOperation结合起来,可能会得到您想要的最终效果。

falq053o

falq053o2#

Here is an example可能与雷米的解决方案类似...

s71maibg

s71maibg3#

是否选中了DragDrop事件?这是在控件上成功放置时引发的事件。
更新:只要你需要将文件拖放到资源管理器并延迟呈现,你可以阅读下面的article(在c#中实现原生shell拖放),使用本文中的信息和代码,你可以创建自己的IDataObject实现并支持延迟呈现。

相关问题