问题描述
我制作了一个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);
...
}
}
我能够从另一个实例中获取数据。