WPF - 使用视图模型数据进行复制/粘贴与拖放时内存不足 [英] WPF - insufficient memory when doing copy/paste vs drag/drop with view model data
问题描述
我有一个 TreeView
,它提供拖放以及复制/粘贴功能.我扩展了 TreeViewItem
以提供该功能.
I have a TreeView
that provides drag and drop as well as copy/paste functionality. I extended TreeViewItem
to provide that functionality.
拖放工作正常.树绑定到一个视图模型,在TreeViewItem
自定义类中发起拖拽如:
The drag and drop works fine. The tree is bound to a view model, and the drag is initiated in the TreeViewItem
custom class such as:
protected override void OnMouseMove(MouseEventArgs e)
{
// ...
if (canDrag)
{
DragDrop.DoDragDrop(this, DataContext, DragDropEffects.Copy);
e.Handled = true;
}
}
drop 发起如:
protected override void OnDrop(DragEventArgs e)
{
// ...
Paste(e.Data);
e.Handled = true;
}
调用一个接收 IDataObject
的粘贴方法,例如:
which calls a paste method that takes in an IDataObject
such as:
protected void Paste(IDataObject data)
{
// ...
if (data.GetDataPresent(typeof(FooViewModel)) == true)
{
// process Foo drop
copiedFoo = data.GetData(typeof(FooViewModel)) as FooViewModel;
// ...
}
}
复制/粘贴操作设置如下.复制在TreeViewItem
自定义类中发起如:
The copy/paste operation is set up as follows. The copy is initiated in the TreeViewItem
custom class such as:
void CopyExecuted(object sender, ExecutedRoutedEventArgs e)
{
Clipboard.Clear();
Clipboard.SetData(DataContext.GetType().ToString(), DataContext);
}
启动粘贴如:
void PasteExecuted(object sender, ExecutedRoutedEventArgs e)
{
Paste(Clipboard.GetDataObject());
}
使用上面的 IDataObject
调用相同的粘贴方法.
calling the same paste method with IDataObject
above.
问题:相同的粘贴方法在 GetData()
调用中失败,并显示 Insufficient memory to continue the execution of the program 消息从复制/粘贴操作中调用.我什至将一个空的视图模型实例传递到剪贴板,同样的内存不足.
Issue: The same paste method fails at the GetData()
call with an Insufficient memory to continue the execution of the program message when called from a copy/paste operation. I've even passed in an empty view model instance to the clipboard, with the same insufficient memory result.
有一个与此类似的已知 VS2010 问题,解释了 这里.我安装了那个修补程序,但内存问题仍然存在.
There has been a known VS2010 issue similar to this, explained here. I installed that hotfix, but the memory issue still persists.
有什么想法吗?我应该以不同的方式与 Clipboard
交互吗?谢谢!
Any ideas? Should I be interacting with the Clipboard
differently? Thanks!
推荐答案
我以前遇到过这个问题,它与在剪贴板中存储一个对象有关.我不记得确切原因,但我需要序列化我的对象并将 byte[]
存储在剪贴板而不是对象本身.
I had this issue in the past, and it has to do with storing an object in the ClipBoard. I can't remember exactly why, but I needed to serialize my object and store the byte[]
in the clipboard instead of the object itself.
我使用的代码如下所示:
The code I used looked something like this:
写作:
byte[] data = SerializationHelpers.SerializeToBinary<TreeNodeBase>(
selectedTreeNode,
new Type[] { typeof(TreeNodeA), typeof(TreeNodeB),typeof(TreeNodeC)}
);
Clipboard.SetDataObject(data, true);
阅读:
IDataObject data = Clipboard.GetDataObject();
if (data.GetDataPresent(typeof(byte[])))
{
MyClass obj = SerializationHelpers.DeserializeFromBinary<TreeNodeBase>(
(byte[])data.GetData(typeof(byte[])),
new Type[] {typeof(TreeNodeA), typeof(TreeNodeB),typeof(TreeNodeC)}
);
}
序列化类
public static byte[] SerializeToBinary<T>(T obj, Type[] extraTypes)
{
if (obj == null)
return null;
using (MemoryStream ms = new MemoryStream())
{
DataContractSerializer dcs = new DataContractSerializer(typeof(T), extraTypes);
dcs.WriteObject(ms, obj);
return ms.ToArray();
}
}
public static T DeserializeFromBinary<T>(byte[] data, Type[] extraTypes)
{
if (data.Length == 0)
return default(T);
using (MemoryStream ms = new MemoryStream())
{
ms.Write(data, 0, data.Length);
ms.Seek(0, 0);
DataContractSerializer dcs = new DataContractSerializer(typeof(T), extraTypes);
return (T)dcs.ReadObject(ms);
}
}
这篇关于WPF - 使用视图模型数据进行复制/粘贴与拖放时内存不足的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!