调用DoDragDrop方法后执行dragdrop实现

时间:2009-06-24 07:24:55

标签: c# winforms events drag-and-drop

我一直在努力解决这个问题

我的应用程序包含一个列表视图,其中填充了文件名,位于服务器上。

我正在尝试实现拖放功能,因此用户可以将文件从我的应用程序拖到他/她的本地计算机中。

为了做到这一点,首先我将文件下载到一个临时位置,然后调用我的应用程序的DoDragDrop()方法。

问题是我想在强调调用DoDragDrop方法后才执行下载过程。

我已尝试过与拖放方法相关的所有事件(GiveFeedback,ItemDrag等等),但没有任何作用

基本上我需要的是一个在DoDragDrop完成后引发的事件

任何想法??

3 个答案:

答案 0 :(得分:3)

不确定如何在.NET中执行此操作,但在常规Win32编程中,实现IDataObject接口的对象也可以选择实现IAsyncOperation接口。然后,IDropTarget可以使用该接口在后台线程中执行drag-n-drop,以便在实际传输期间不阻止源和目标。唯一的问题是目标而不是来源决定是否利用这一点。

另一种方法是使用“优化移动”传输,其中IDataObject提供文件名,IDropTarget直接移动文件。

MSDN详细说明:Handling Shell Data Transfer Scenarios

当然,这仍然意味着您必须在开始拖放之前下载文件。实际上没有办法执行drag-n-drop来确定目标,然后再执行下载。但是,你可以做的是让IDataObject保留CFSTR_FILEDESCRIPTORCFSTR_FILECONTENTS条目(在此处描述:Shell Clipboard Formats),其中CFSTR_FILEDESCRIPTOR填写您以前的信息填充ListView,CFSTR_FILECONTENTS使用IStream接口,其实现在实际的放置操作期间而不是之前执行下载。至少就是这样,你只是下载目标实际想要的文件,可以跳过其余的文件。

与IAsyncOperation结合使用,这可能会为您提供最终效果。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

您检查过DragDrop事件了吗?这是成功放弃控件时引发的事件。

更新:只要您需要使用延迟渲染将文件拖放到资源管理器,您就可以阅读以下article(在c#中实现本机shell drag-n-drop)。使用本文中的信息和代码,您可以使用延迟呈现支持创建自己的IDataObject实现。