WPF - 使用视图模型数据进行复制/粘贴与拖放时内存不足
我有一个提供拖放以及复制/粘贴功能的TreeView
。我扩展了 TreeViewItem 来提供该功能。
拖放效果很好。树绑定到视图模型,并且在 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< 的粘贴方法/code> 如:
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()
调用时失败,并在从 a 调用时出现 内存不足,无法继续执行程序 消息复制/粘贴操作。我什至将一个空视图模型实例传递到剪贴板,同样出现内存不足的结果。
有一个已知的 VS2010 问题与此类似,解释为 此处。我安装了该修补程序,但内存问题仍然存在。
有什么想法吗?我应该以不同的方式与 Clipboard
进行交互吗?谢谢!
I have a TreeView
that provides drag and drop as well as copy/paste functionality. I extended TreeViewItem
to provide that functionality.
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;
}
}
The drop is initiated such as:
protected override void OnDrop(DragEventArgs e)
{
// ...
Paste(e.Data);
e.Handled = true;
}
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;
// ...
}
}
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);
}
The paste is initiated such as:
void PasteExecuted(object sender, ExecutedRoutedEventArgs e)
{
Paste(Clipboard.GetDataObject());
}
calling the same paste method with IDataObject
above.
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.
There has been a known VS2010 issue similar to this, explained here. I installed that hotfix, but the memory issue still persists.
Any ideas? Should I be interacting with the Clipboard
differently? Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我过去遇到过这个问题,它与在剪贴板中存储对象有关。我不记得确切的原因,但我需要序列化我的对象并将
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:
Writing:
Reading:
Serialization Classes