我一直在VB.NET中开发一个应用程序,它需要将一个控制对象(例如,一个ListViewItem)拖出表单,然后拖到用户指定的位置(例如,在桌面上,或者一个文件夹)。
但是,“ListViewItem”所代表的“复制”文件尚不存在。需要下载然后将其放在用户指定的位置。我能够获得目的地丢弃的路径/位置吗?然后我会继续下载该文件,然后将其放在指定用途的位置。
我已经查看了有关similar issue的其他问题,其中详细说明了表单外的拖动操作,它似乎没有办法确定快捷方式的去向或如何标记目标位置。
基本上,我认为它可能需要某种“动态链接”或“虚拟文件”,正如我在别处看到的那样。然后,在删除操作之后,以某种方式从我的应用程序访问此“链接”,继续下载文件并将其放在最终的放置目标中。
感谢任何帮助,提前谢谢!
的观察:
Roger Lipscombe提供了一个链接,其中包含其他文章的链接,以及看似有希望的信息。 以下链接可能在实现拖放操作时非常有用,而无需提供托管代码中所需的确切数据。
答案 0 :(得分:5)
通过在IDataObject :: GetData实现中响应CFSTR_PREFERREDDROPEFFECT,您可以要求Explorer将IDataObject :: GetData调用延迟到CFSTR_FILEDESCRIPTOR到实际发生丢弃的时间。有关示例,请参阅http://hg.mozilla.org/mozilla-central/file/b49a6a8a4973/widget/src/windows/nsDataObj.cpp。请注意,如果目标是虚拟文件夹,则放置目标没有义务遵守您的偏好。
资源管理器按照顺序检查文件名的剪贴板格式
CF_HDROP
CFSTR_FILEDESCRIPTOR / CFSTR_FILECONTENTS
CFSTR_FILENAME
不要使用CF_HDROP,因为它要求源文件实际存在于文件系统的某个位置。请改用CFSTR_FILEDESCRIPTOR / CFSTR_FILECONTENTS。
答案 1 :(得分:2)
对不起,但是无法获得DnD操作的目标路径。因为掉落目标甚至可能没有路径!
有关更详细的说明,请参阅here。
当然,您可以尝试挂钩到DnD,然后询问目标窗口,并从那里尝试找到目标路径,如果窗口是您已知的(例如,窗口属于资源管理器进程)。 / p>
答案 2 :(得分:2)
你真的想知道“文件”的删除位置吗?或者你只是不想提前提供数据?
如果是后者,Raymond Chen在本机代码中有一个完整的series on implementing virtual drag and drop。大卫安森translates it into managed code和adds asynchronous support。