实现延迟拖放技术

7
我正在尝试实现一种惰性拖放操作。 我希望向用户显示一个文件列表视图,当用户拖动文件并将其放入文件夹中时,应下载并传递内容。
我正在使用IDataObject接口,但我的问题是GetData()方法被查询得太早了。例如,在桌面上拖动(没有涉及任何拖放)会多次查询GetData()方法。每个调用都会开始下载文件:/。
现在,我的问题是:这里出了什么问题-为什么在没有任何拖放的情况下调用GetData()方法?是否有另一种方法在.net中实现惰性拖放操作?

你将会遇到的问题是在Explorer中监听drop事件,这是你想要启动下载时的事件。你可以通过在表单中拖放到另一个控件上来证明这一点,然后你就能够订阅drop事件了。 - Adam Houldsworth
是的,这可能会对我有所帮助,但它听起来更加复杂,并且仅将我的拖放绑定到了资源管理器。其他接受文件拖放的目标无法获取数据。理论上,拖放事件应调用IDataObject.GetData()-只有它应该这样做。然后我可以传递数据(直接或通过下载)。然而,存在不涉及拖放的对此函数的调用,这使得这种方法不可用。 - tanascius
有没有办法推迟下载,直到接收端实际要求查看字节? - user180326
2个回答

1

也许这对你有用...

每次出现 GetData() 时,执行以下操作:

  • 你需要一个定时器。
  • 如果你的定时器已经在运行,就停止它。
  • 创建并启动一个新的定时器。将其设置为1秒或根据实验确定其持续时间。
  • 在定时器事件中执行必要的操作。

我在许多需要此类解决方法的情况下使用类似的过程。


这里的问题在于拖动可能根本就被取消。 - tanascius
你是说你无法区分已完成的拖放和取消的拖放吗? - Daniel Mošmondor
是的,在拖放操作被中止的情况下,如何中止计时器? - tanascius
如果你现在还没有解决这个问题,我可以尝试按照你的方式来解决你所遇到的问题... - Daniel Mošmondor

1

我认为正在调用GetData,以便(潜在的)放置目标可以确定它是否可以接受(潜在的)放置项。您考虑过使用Shell扩展吗?


据我所了解,应该首先调用GetDataPresent方法。仍在尝试中... - tanascius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接