WPF / WinForms DragDrop IDataObject

时间:2010-10-14 13:56:47

标签: wpf winforms drag-and-drop

我想知道为什么WPF为其拖放系统定义了一个新的且显然相同的IDataObject版本?

我有应用程序代码,它使用winforms IDataObject,我现在需要与WPF拖放事件进行互操作。简单地编写一个实现System.Windows.Forms.IDataObject的适配器类,但是将调用传递给WPF提供的实际System.Windows.IDataObject是否安全?

由于 丹

2 个答案:

答案 0 :(得分:0)

如果是同一个应用程序中的拖放,你可以看看: WinForms Interop, Drag & Drop from WinForms -> WPF

请注意,您可能会更好地为对象实现序列化。

答案 1 :(得分:0)

场景

当我尝试调试此问题时,我发现了这个问题:

我正在放入WinForms应用程序,其中在Drop事件处理程序中,我收到的对象是System.Windows.Forms.IDataObject

但是,我正在使用一个库来执行Drop事件的繁重工作,并且它期望使用System.Windows.IDataObject类型的对象。我无法编辑库源代码。

问题

如果我试图在类型之间简单地转换...

// data is of type System.Windows.Forms.IDataObject
var newData = (System.Windows.IDataObject)data; // debugger exits function after this line of code

...调试器将在该行代码中退出该函数,而不会出现错误。该行之后的任何代码都不会执行。

解决方案

我创建了一个代理方法,该方法在WinForms事件处理程序中调用。 System.Windows.DataObject的构造函数将接受System.Windows.Forms.DataObject

public void DropEventProxy(System.Windows.Forms.IDataObject data)
{
    System.Windows.IDataObject newData = new System.Windows.DataObject(data);    
    LibraryDropEventHandler(newData);
}

public string LibraryDropEventHandler(System.Windows.IDataObject data);