【问题标题】:Perform dragdrop implementation after DoDragDrop method is called在调用 DoDragDrop 方法后执行拖放操作
【发布时间】:2010-11-05 10:20:35
【问题描述】:

我已经为此苦苦挣扎了一段时间

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

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

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

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

我已经尝试了与拖放方法(GiveFeedback、ItemDrag 等)相关的所有事件,但没有任何效果

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

有什么想法吗??

【问题讨论】:

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


    【解决方案1】:

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

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

    MSDN 对此有详细说明:Handling Shell Data Transfer Scenarios

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

    将其与 IAsyncOperation 结合使用,可能会为您提供所需的最终效果。

    【讨论】:

    • 听起来不错,唯一的问题是我不知道如何将它翻译成 C#。你有没有机会发布一个 sn-p (任何编程语言),我会尝试翻译它?谢谢
    • (C++) 你也可以按照这个人说的做,当(如果)发生下降时,在返回 IStream 之前,将文件下载到暂存目录,然后返回一个 IStream 将其复制到放置位置
    • IStream 实现在第一次调用其 Read() 方法时可以启动实际下载,并在数据可用时返回数据,这并没有太大的好处。使用暂存区只会减慢目标等待文件的时间。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 不,我不能使用它,因为我将 我的控件拖入,而不是拖入其中
      • 但是拖放操作是在您的应用程序内部执行的,还是您拖到另一个应用程序中?
      • 从我的应用程序到另一个应用程序(Windows 资源管理器,就此而言)
      猜你喜欢
      • 1970-01-01
      • 2020-07-27
      • 2018-08-04
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多