拖放完成或取消时在拖放源中触发的事件

Posted

技术标签:

【中文标题】拖放完成或取消时在拖放源中触发的事件【英文标题】:Event fired in dragdrop source when dragdrop is completed or cancelled 【发布时间】:2012-01-08 03:30:54 【问题描述】:

我知道通常有一个DoDragDrop 方法来启动拖放操作。并且有可以在目标端处理的事件(例如DragEnterDragOverDragDropDragLeave)。

拖放源上是否有任何事件可以告诉我拖放操作是否已完成或可能已取消?

【问题讨论】:

这就是 DragOver 所做的。开个玩笑。 【参考方案1】:

是的,DoDragDrop() 有一个返回值。如果放置被取消,则返回 DragDropEffects.None。

【讨论】:

另一个选项是QueryContinueDrag 事件,尽管在这种情况下。我相信返回结果将是最合适的。谢谢!【参考方案2】:

您指的是类似于 Windows 资源管理器中的 delete-on-paste 的情况,在发生粘贴操作之前不会从源文件夹中删除文件。

http://msdn.microsoft.com/en-us/library/bb776904(VS.85).aspx#delete_on_paste

简单回答

如果您在应用程序的同一实例中执行此操作,则这称为 优化移动,您可以在其中简单地设置一个本地标志(例如布尔变量)来确定它是否成功了。

更新:是的,您还可以检查 DoDragDrop 方法的结果以确定放置是否成功。如果在完成放置时出现错误,请确保您的放置处理代码正确地将 Effect 设置为 None,否则您的 DoDragDrop 代码会认为放置成功。此方法甚至可以在您的应用程序的两个实例之间工作。

很难回答

如果您在应用程序的两个实例之间执行此操作,并且您需要传输更多信息以了解放置是否成功,那么您需要实现 IDataObject 的 OLE 版本,以便应用程序实例是放置目标完成拖放,它可以在源对象上调用SetData发送结果信息。这很复杂,但肯定是可能的。

有关执行此操作的更多信息,请参阅以下链接:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comtypes.idataobject.aspx

http://blogs.msdn.com/b/delay/archive/2009/10/26/creating-something-from-nothing-developer-friendly-virtual-file-implementation-for-net.aspx

【讨论】:

以上是关于拖放完成或取消时在拖放源中触发的事件的主要内容,如果未能解决你的问题,请参考以下文章

当 iframe 在拖放功能中移动时,Chrome 中的 Dragend 事件未触发

在拖放期间重绘

拖放事件触发两次

js拖放事件详解及实战

ondrag事件

HTML5 拖放事件 - dragLeave 在放置前触发