gpt4 book ai didi

WPF - 使用 View 模型数据进行复制/粘贴与拖放时内存不足

转载 作者:行者123 更新时间:2023-12-03 10:15:24 28 4
gpt4 key购买 nike

我有一个 TreeView它提供拖放以及复制/粘贴功能。我扩展了TreeViewItem提供该功能。

拖放 工作正常。树绑定(bind)到一个 View 模型,并且在 TreeViewItem 中启动拖动。自定义类,例如:

    protected override void OnMouseMove(MouseEventArgs e)
{
// ...
if (canDrag)
{
DragDrop.DoDragDrop(this, DataContext, DragDropEffects.Copy);
e.Handled = true;
}
}

下降开始,例如:
    protected override void OnDrop(DragEventArgs e)
{
// ...
Paste(e.Data);
e.Handled = true;
}

它调用一个接收 IDataObject 的粘贴方法如:
    protected void Paste(IDataObject data)
{
// ...
if (data.GetDataPresent(typeof(FooViewModel)) == true)
{
// process Foo drop
copiedFoo = data.GetData(typeof(FooViewModel)) as FooViewModel;
// ...
}
}

复制/粘贴操作设置如下。复制在 TreeViewItem 中启动自定义类,例如:
    void CopyExecuted(object sender, ExecutedRoutedEventArgs e)
{
Clipboard.Clear();
Clipboard.SetData(DataContext.GetType().ToString(), DataContext);
}

启动粘贴,例如:
    void PasteExecuted(object sender, ExecutedRoutedEventArgs e)
{
Paste(Clipboard.GetDataObject());
}

使用 IDataObject 调用相同的粘贴方法多于。

问题:相同的粘贴方法在 GetData() 处失败当从复制/粘贴操作调用时,调用内存不足以继续执行程序消息。我什至将一个空的 View 模型实例传递给剪贴板,同样的内存不足。

有一个与此类似的已知 VS2010 问题,解释为 here .我安装了该修补程序,但内存问题仍然存在。

有任何想法吗?我应该与 Clipboard 互动吗?不同?谢谢!

最佳答案

我过去遇到过这个问题,它与在剪贴板中存储一个对象有关。我不记得确切原因,但我需要序列化我的对象并存储 byte[]在剪贴板而不是对象本身。

我使用的代码如下所示:

写作:

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 - 使用 View 模型数据进行复制/粘贴与拖放时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6999142/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com