尝试在两个WPF应用程序之间拖放时发生System.Runtime.InteropServices.COMException

问题描述

我制作了一个WPF应用程序,该程序允许拖放我制作的类的实例(FakeNodeviewmodel)。当我仅使用一个应用程序实例时,它可以正常工作。但是,当我使用2并尝试将一个对象从一个对象拖放到另一个对象时,放置时会出现异常:

System.Runtime.InteropServices.COMException: 'Tymed non valide (Exception de HRESULT : 0x80040069 (DV_E_TYMED))'

,两个实例崩溃。我处理掉落的方法是这样开始的:

private void grid_Drop(object sender,DragEventArgs e) {
        if (e.Data.GetDataPresent("fakeNode")) {
            var fakeNodeviewmodel = (FakeNodeviewmodel)e.Data.GetData("fakeNode");

,程序在var fakeNodeviewmodel = (FakeNodeviewmodel)e.Data.GetData("fakeNode");崩溃 我没有找到太多有关此的信息。有谁知道会发生什么情况以及如何解决

解决方法

您应该使用FakeNodeViewModel装饰System.SerializableAttribute类,因为它是COM可序列化的:

[Serializable]
public class FakeNodeViewModel
{
    ...
}
,

感谢mm8的回答。确实,我必须在[Serializable]类中添加FakeNodeViewModel属性。然后,我必须像这样进行拖放操作:

拖动:

private void MoveFakeNode(object sender,MouseEventArgs e) {
            if (e.LeftButton == MouseButtonState.Pressed) {
                // Current mouse position
                var fakeNodeViewModel = (FakeNodeViewModel)((FrameworkElement)e.OriginalSource).DataContext;
                var dataObject = new DataObject(DataFormats.Serializable,fakeNodeViewModel);
                DragDrop.DoDragDrop((DependencyObject)e.Source,dataObject,DragDropEffects.Copy);
            }
        }

放置:

private void grid_Drop(object sender,DragEventArgs e) {
    if (e.Data.GetDataPresent(DataFormats.Serializable)) {
        // Get the fake node
        var fakeNodeViewModel =(FakeNodeViewModel)e.Data.GetData(DataFormats.Serializable);
        ...
    }
}

我能够从另一个实例中获取数据。