代码之家  ›  专栏  ›  技术社区  ›  Nissim

在调用DoDragDrop方法后执行DragDrop实现

  •  4
  • Nissim  · 技术社区  · 15 年前

    我已经为此挣扎了很久了

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

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

    为此,首先将文件下载到临时位置,然后调用应用程序的doDragDrop()方法。

    问题是我只想执行下载过程 之后 调用DoDragDrop方法。

    我尝试过与拖放方法(giveFeedback、itemDrag等)相关的每个事件,但没有任何效果。

    所以基本上我需要的是一个事件,在DodragDrop完成后引发的。

    有什么想法吗??

    3 回复  |  直到 14 年前
        1
  •  3
  •   Remy Lebeau    15 年前

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

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

    有关这方面的详细信息: Handling Shell Data Transfer Scenarios .

    当然,这仍然意味着在开始拖放之前必须下载文件。确实没有办法执行拖放来确定目标,然后再执行下载。不过,您可以做的是保留IDataObject CFSTR_FILEDESCRIPTOR CFSTR_FILECONTENTS 条目(此处描述: Shell Clipboard Formats ,在那里 cfstr_文件描述符 是根据用于填充ListView的信息填充的,并且 cfstr_文件内容 使用IStream接口,其实现在实际放置操作期间执行下载,而不是在实际放置操作之前执行下载。至少这样,您只能下载目标真正想要的文件,并且可以跳过其余的文件。

    将其与iAsyncOperation结合起来,这可能会为您提供所需的最终效果。

        2
  •  3
  •   tbischel    14 年前

    Here is an example 这可能类似于雷米的解决方案…

        3
  •  0
  •   arbiter    15 年前

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

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