【发布时间】:2011-04-23 04:41:11
【问题描述】:
我有一个 C# .NET 3.5 应用程序,它允许从树中拖动项目并将它们作为文件拖放到文件夹中。这是我的代码
String absolutePathToFile=...get absolute path
DataObject dataObject = new DataObject();
StringCollection paths = new StringCollection();
paths.Add(absolutePathToFile);
dataObject.SetFileDropList(paths);
DoDragDrop(dataObject, DragDropEffects.Copy);
这很好用,除非与另一个通过拖放接受文件的 C# 应用程序交互时,另一个 C# 应用程序具有以下 DragOver 处理程序
if ((e.Data is DataObject) && (e.Data as DataObject).ContainsFileDropList())
{
e.Effect = DragDropEffects.Copy;
}
块永远不会被执行,因为 e.Data 是 __ComObject 而不是 DataObject。有趣的是,当我将文件从文件夹中拖到第二个应用程序上时,它会将其视为 DataObject。
如何使第一个 C# 应用程序中的 DataObject 在第二个 C# 应用程序中显示为 DataObject?
【问题讨论】:
-
尝试将 e.Data 转换为 DataObject。例如:
DataObject obj = e.Data as DataObject; if (obj != null) { //Your code } -
@fardjad 如果
(e.Data is DataObject)为假,那么您尝试将 e.Data 安全地转换为 DataObject,它将为空。 -
e.Data 是一个 COM 对象,
In the Microsoft .NET Framework, the GetType.Type operator for a COM object will return the System.__ComObject class. In some coding scenarios, you may have to know the specific class for an object.[ support.microsoft.com/kb/320523 ] 当然,您应该将此 e.Data 转换为 DataObject 或其他类。 -
让我明确一点:第二个接收文件的应用程序是我们需要集成的外部应用程序。我无法修改它。我使用 Reflector 提取代码然后构建测试应用程序。测试应用程序显示,当我从资源管理器中拖动文件时,应用程序会看到 DataObject,但是当我从 C# 应用程序启动拖动时,它会看到 __ComObject。此外,C# 应用程序中的本地拖放从 e.Data 返回 DataObject,而跨进程边界拖放则生成 __ComObject。从资源管理器和本机应用程序拖放产生 DataObject。我正在尝试
标签: c# drag-and-drop