我已经纠结了很久了我的应用程序包含一个列表视图,其中填充了位于服务器上的文件名。我正在尝试实现拖放功能,以便用户可以将文件从我的应用程序拖到他/她的本地计算机中。为此,我首先将文件下载到一个临时位置,然后调用应用程序的DoDragDrop()方法。问题是我只想在调用DoDragDrop方法之后执行下载过程。我尝试了与拖放方法相关的每个事件(GiveFeedback、ItemDrag等),但没有任何效果因此,基本上我需要的是一个在DoDragDrop完成后引发的事件有什么主意吗?
slsn1g291#
不知道如何在. NET中实现这一点,但在常规Win32编程中,实现IDataObject接口的对象也可以选择性地实现IAsyncOperation接口。然后IDropTarget可以使用该接口在后台线程中执行拖放操作,以便源和目标在实际传输过程中不会被阻塞。唯一的问题是目标(而不是源)决定是否利用这一点。另一种方法是使用"优化移动"传输,其中IDataObject提供文件名,IDropTarget直接移动文件。MSDN对此有详细说明:Handling Shell Data Transfer Scenarios.当然,这仍然意味着您必须在开始拖放之前下载文件。确实没有办法执行拖放来确定目标,然后再执行下载。不过,您可以做的是让IDataObject保存CFSTR_FILEDESCRIPTOR和CFSTR_FILECONTENTS条目(如下所述:Shell Clipboard Formats),其中CFSTR_FILEDESCRIPTOR是根据您用于填充ListView的信息填充的,CFSTR_FILECONTENTS使用IStream接口,这些接口的实现在实际放置操作期间而不是之前执行下载。至少这样,您只下载目标真正需要的文件,并可以跳过其余部分。将其与IAsyncOperation结合起来,可能会得到您想要的最终效果。
CFSTR_FILEDESCRIPTOR
CFSTR_FILECONTENTS
falq053o2#
Here is an example可能与雷米的解决方案类似...
s71maibg3#
是否选中了DragDrop事件?这是在控件上成功放置时引发的事件。更新:只要你需要将文件拖放到资源管理器并延迟呈现,你可以阅读下面的article(在c#中实现原生shell拖放),使用本文中的信息和代码,你可以创建自己的IDataObject实现并支持延迟呈现。
3条答案
按热度按时间slsn1g291#
不知道如何在. NET中实现这一点,但在常规Win32编程中,实现IDataObject接口的对象也可以选择性地实现IAsyncOperation接口。然后IDropTarget可以使用该接口在后台线程中执行拖放操作,以便源和目标在实际传输过程中不会被阻塞。唯一的问题是目标(而不是源)决定是否利用这一点。
另一种方法是使用"优化移动"传输,其中IDataObject提供文件名,IDropTarget直接移动文件。
MSDN对此有详细说明:Handling Shell Data Transfer Scenarios.
当然,这仍然意味着您必须在开始拖放之前下载文件。确实没有办法执行拖放来确定目标,然后再执行下载。不过,您可以做的是让IDataObject保存
CFSTR_FILEDESCRIPTOR
和CFSTR_FILECONTENTS
条目(如下所述:Shell Clipboard Formats),其中CFSTR_FILEDESCRIPTOR
是根据您用于填充ListView的信息填充的,CFSTR_FILECONTENTS
使用IStream接口,这些接口的实现在实际放置操作期间而不是之前执行下载。至少这样,您只下载目标真正需要的文件,并可以跳过其余部分。将其与IAsyncOperation结合起来,可能会得到您想要的最终效果。
falq053o2#
Here is an example可能与雷米的解决方案类似...
s71maibg3#
是否选中了DragDrop事件?这是在控件上成功放置时引发的事件。
更新:只要你需要将文件拖放到资源管理器并延迟呈现,你可以阅读下面的article(在c#中实现原生shell拖放),使用本文中的信息和代码,你可以创建自己的IDataObject实现并支持延迟呈现。