【发布时间】:2026-02-14 20:25:01
【问题描述】:
我正在尝试将一个项目拖到资源管理器中。
该项目应该导致文件下载,所以我使用了我在网上找到的一个示例来使用CustomDataObject 下载文件,当他实际需要流时调用一个事件,然后我的应用程序执行繁重的提升并执行下载。
它在类似的剪贴板操作中运行良好。
实际的文件下载也会导致我的应用程序中的一些 UI 发生变化。主要是在表单上更改的“工作”图标,以及出现错误时的弹出气球。
在剪贴板操作中,我只在需要时使用了InvokeRequired 和BeginInvoke,以确保这些UI 更改发生在主线程上。在拖动操作中,UI 线程正在等待从DoDragDrop 返回,而由CustomDataObject 引发的事件正在另一个线程上调用。当我尝试调用BeginInvoke 或Invoke 时,UI 线程仍在等待,我无法完成删除。
在访问源应用程序的 UI 时,是否有关于如何允许跨应用程序拖放的示例或推荐的最佳实践?
更新
here 是 CodeProject 的原始文章,DataObjectEx 是我为自己修改的。我只是将GetFileContents 方法更改为调用一个虚拟方法,该方法返回一个包含从类继承的文件数据的Stream,并重写该虚拟方法以从网络获取文件。
当我想在获取文件的同时更改 UI 中的内容时,问题就出现了。正如我之前所说 - 主 UI 线程仍然“卡在”DoDragDrop 方法调用中,因此我无法按时调用它来执行工作线程在下载文件之前和之后所需的 UI 更改。
【问题讨论】:
-
在您描述“CustomDataObject”是什么类型的动物以及它如何在您的应用程序中运行代码之前,我怀疑您会得到一个有用的答案。
-
我会深入挖掘,从网上找到我使用的代码示例
标签: c# winforms drag-and-drop