我正在使用装饰器来显示被拖动元素的“幽灵”...
var adornerLayer = AdornerLayer.GetAdornerLayer(topLevelGrid);
dragAdorner = new DragAdorner(topLevelGrid, itemToDrag);
adornerLayer.Add(dragAdorner);
dragAdorner.UpdatePosition(e.GetPosition(topLevelGrid));
DragDrop.DoDragDrop(sourceItems, viewModel, DragDropEffects.Move);
adornerLayer.Remove(dragAdorner);
itemToDrag = null;
...但是我找不到在拖动过程中更新装饰器位置的好方法。我最接近的方法是在顶级网格上设置 AllowDrop="true"
并给它一个 DragOver 处理程序......
private void TopLevelGrid_OnDragOver(object sender, DragEventArgs e)
{
dragAdorner.UpdatePosition(e.GetPosition(topLevelGrid));
}
但这意味着我没有在光标上得到正确的 DragDropEffects
反馈,即它总是显示 DragDropEffects.Move
光标而不是 DragDropEffects。没有
,直到我超过了实际的放置目标。
有人知道更新装饰器位置的更好方法吗?
最佳答案
有this (不幸的是,只能作为缓存版本提供)来自 Bea Stollnitz 的相当古老的博客文章,它几乎涵盖了您的问题。它有一个很好的拖放实现,带有一个显示“幽灵图像”的装饰器。
基本上,WPF 中的拖放是一个相当复杂的过程——如果你想要一些自定义 DragAdorners——涉及添加一堆附加的依赖属性来处理所有涉及的事件的设置,特别是用于以不显示装饰器的方式'不干扰丢弃代码。
Bea 的代码通过一个帮助类来工作,该类在实际拖放之前设置拥有 Window
的 DragOver
事件处理程序和 AllowDrop
操作,这样您就可以控制实际拖动源和放置目标之间的所有移动。
关于wpf - 如何在 WPF 拖放期间更新拖动装饰器的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2094448/