У меня есть TreeView
, который обеспечивает перетаскивание, а также функцию копирования / вставки. Я расширил TreeViewItem
, чтобы обеспечить эту функциональность.
drag & drop работает отлично. Дерево связывается с моделью представления, и перетаскивание инициируется в пользовательском классе 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()
с Недостаточно памяти для продолжения выполнения программного сообщения при вызове из операции копирования / вставки. Я даже передал пустой экземпляр модели представления в буфер обмена с таким же недостаточным результатом памяти.
Была известная проблема VS2010, подобная этой, объясненная здесь . Я установил это исправление, но проблема с памятью все еще сохраняется.
Есть идеи? Должен ли я взаимодействовать с Clipboard
по-другому? Спасибо!