【问题标题】:Implement lazy drag & drop实现延迟拖放
【发布时间】:2010-09-14 12:56:05
【问题描述】:

我正在尝试实现延迟拖放操作。我想向我的用户显示一个包含文件的列表视图,当用户将文件拖放到文件夹中时,应该下载并交付内容。

我正在使用IDataObject 接口,但我的问题是GetData() 方法查询得太早了。例如,在桌面上拖动(不涉及任何拖放)将查询 GetData() 方法几次。这些调用中的每一个都开始下载文件:/

现在,我的问题是:这里出了什么问题 - 为什么调用 GetData() 方法时没有任何丢弃? .net 中是否有另一种实现延迟拖放操作的方法?

【问题讨论】:

  • 您将遇到的问题是在资源管理器中监听 drop 事件,这是您想要启动下载的时候。您可以通过拖放到表单中的另一个控件上来验证这一点,您将能够订阅它的 drop 事件。
  • 是的,这可以帮助我,但它听起来要复杂得多,并且只将我的 drop 绑定到 explorer。其他正常接受文件删除的目标将无法获取数据。理论上,drop 事件应该调用 IDataObject.GetData() - 只有它应该这样做。然后我可以提供数据(直接或通过下载)。然而,在调用这个函数时没有涉及到 drop,这使得这种方法无法使用。
  • 有没有办法延迟下载,直到接收端真正要求查看字节?

标签: c# drag-and-drop lazy-evaluation


【解决方案1】:

也许这对你有用...

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

  • 你需要一个计时器。
  • 如果您的计时器已经激活,请将其关闭。
  • 创建并启动一个新计时器。使其为 1 秒或从实验中确定其持续时间。
  • 在定时器事件上做必须做的事情。

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

【讨论】:

  • 这里的问题是拖拽完全可以取消。
  • 您是说无法区分已完成的拖放和已取消的拖放?
  • 是的,如果拖放操作中止,如何中止计时器?
  • 如果您现在还没有解决,我可以尝试按照您的方式解决您遇到的问题...
【解决方案2】:

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

【讨论】:

  • 据我了解应该首先调用GetDataPresent 方法。还在尝试...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多