我一直在努力解决这个问题
我的应用程序包含一个列表视图,其中填充了文件名,位于服务器上。
我正在尝试实现拖放功能,因此用户可以将文件从我的应用程序拖到他/她的本地计算机中。
为了做到这一点,首先我将文件下载到一个临时位置,然后调用我的应用程序的DoDragDrop()方法。
问题是我想在>强调调用DoDragDrop方法后才执行下载过程。
我已尝试过与拖放方法相关的所有事件(GiveFeedback,ItemDrag等等),但没有任何作用
基本上我需要的是一个在DoDragDrop完成后引发的事件
任何想法??
答案 0 :(得分:3)
不确定如何在.NET中执行此操作,但在常规Win32编程中,实现IDataObject接口的对象也可以选择实现IAsyncOperation接口。然后,IDropTarget可以使用该接口在后台线程中执行drag-n-drop,以便在实际传输期间不阻止源和目标。唯一的问题是目标而不是来源决定是否利用这一点。
另一种方法是使用“优化移动”传输,其中IDataObject提供文件名,IDropTarget直接移动文件。
MSDN详细说明:Handling Shell Data Transfer Scenarios。
当然,这仍然意味着您必须在开始拖放之前下载文件。实际上没有办法执行drag-n-drop来确定目标,然后再执行下载。但是,你可以做的是让IDataObject保留CFSTR_FILEDESCRIPTOR
和CFSTR_FILECONTENTS
条目(在此处描述:Shell Clipboard Formats),其中CFSTR_FILEDESCRIPTOR
填写您以前的信息填充ListView,CFSTR_FILECONTENTS
使用IStream接口,其实现在实际的放置操作期间而不是之前执行下载。至少就是这样,你只是下载目标实际想要的文件,可以跳过其余的文件。
与IAsyncOperation结合使用,这可能会为您提供最终效果。
答案 1 :(得分:3)
Here is an example可能与雷米的解决方案类似......
答案 2 :(得分:0)