【问题标题】:Drag & Drop from Form to Windows; get drop destination从窗体拖放到 Windows;获取放置目的地
【发布时间】:2010-02-14 14:13:57
【问题描述】:

我一直在用 VB.NET 开发一个应用程序,它需要将控件对象(例如 ListViewItem)拖出表单,并拖到用户指定的位置(例如,在桌面上或文件夹)。

但是,要“复制”的文件(如“ListViewItem”所示)尚不存在。它需要被下载然后放置在用户指定的位置。我能否获得目的地丢弃的路径/位置?然后我会继续下载文件,然后将其放置在指定用途的位置。

我查看了有关similar issue 的其他问题,其中详细说明了表单外的拖动操作,只是似乎没有办法确定该快捷方式的位置或如何标记目标位置。

本质上,我认为它可能需要某种“动态链接”或“虚拟文件”,正如我在其他地方看到的那样。然后,在放置操作之后,以某种方式从我的应用程序访问此“链接”,继续下载文件并将其放置在最终放置目标中。

任何帮助表示赞赏,在此先感谢!


结果:

Roger Lipscombe 提供了一个链接,其中包含指向其他文章的链接,其中包含看起来很有希望的信息。 在不提供托管代码所需的确切数据的情况下,以下链接可能有助于实现拖放操作。

【问题讨论】:

    标签: vb.net file-io drag-and-drop


    【解决方案1】:

    您可以通过在您的 IDataObject::GetData 实现中响应 CFSTR_PREFERREDDROPEFFECT 来要求资源管理器将对 CFSTR_FILEDESCRIPTOR 的 IDataObject::GetData 调用延迟到实际发生丢弃的时间。有关示例,请参阅http://hg.mozilla.org/mozilla-central/file/b49a6a8a4973/widget/src/windows/nsDataObj.cpp。请注意,如果目标是虚拟文件夹,则放置目标没有义务遵守您的偏好。

    Explorer 按以下顺序检查文件名的剪贴板格式

    1. CF_HDROP

    2. CFSTR_FILEDESCRIPTOR/CFSTR_FILECONTENTS

    3. CFSTR_FILENAME

    不要使用 CF_HDROP,因为它要求源文件实际存在于文件系统的某个位置。请改用 CFSTR_FILEDESCRIPTOR/CFSTR_FILECONTENTS。

    【讨论】:

    • 酷,那么我将如何在托管的 VB.NET 代码中使用它呢?我不会写 C,所以我不知道如何为它做一个包装器。
    • 对不起,不知道VB.Net。也许你可以使用 Reflecter 来检查 Windows Forms 是如何实现 IDataObject 的。
    • 可以在此处找到所描述机制的 .NET 实现:codeproject.com/KB/dotnet/DataObjectEx.aspx
    【解决方案2】:

    您真的想知道“文件”的删除位置吗?还是您只是不想预先提供数据?

    如果是后者,Raymond Chen 有一个完整的series on implementing virtual drag and drop,在本机代码中。大卫·安森translates it into managed codeadds asynchronous support

    【讨论】:

    • 在不使用非托管代码进行拖放操作的情况下,我能想到的唯一解决方法是了解文件的放置位置。尽管如此,您提供的链接;导致了虚拟文件拖动的托管代码实现。我还没有实现,但是代码文章看起来绝对像我要找的。谢谢:)
    • 只需将这些相关链接添加到您的答案中(blogs.msdn.com/delay/archive/2009/10/26/…blogs.msdn.com/delay/archive/2009/11/04/…),我会很高兴地接受这个答案:)
    【解决方案3】:

    很抱歉,没有办法获取 DnD 操作的目标路径。因为放置目标可能甚至没有路径!

    请参阅here 以获得更详细的说明。

    当然,您可以尝试连接 DnD,然后请求目标窗口,如果您知道该窗口(例如,该窗口属于资源管理器进程),则从那里尝试找到目标路径。

    【讨论】:

    • 所以本质上是要求指定拖拽数据?我们不能以某种方式使数据成为占位符文件,或者某种形式的指针,我们可以在以后跟踪和定位吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多