2010-01-19 62 views
3

我使用的装饰器来显示被拖动的元素的“鬼” ......如何在WPF拖放过程中更新拖动装饰的位置?

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.None,直到我超过实际放置目标。

有没有人知道一个更好的方式来更新装饰者的位置?

回答

6

还有this(不幸的是只能作为一个缓存版本)来自Bea Stollnitz的相当古老的博客文章,它几乎涵盖了你的问题。它有一个很好的实现拖放与装饰显示“鬼影”。

基本上在WPF中的拖放是相当复杂的过程 - 如果你想要一些自定义的DragAdorners - 包括添加一堆附加的依赖项属性来处理涉及的所有事件的设置,特别是以一种方式显示装饰器不会干扰掉码。

衣的代码工作由具有辅助类,设置了拥有WindowDragOver事件处理程序和AllowDrop权实际拖放操作之前,这样你可以控制所有的实际拖动源和放置目标之间的移动。

3

所以,看Bea's code越接近redoced指的是......

我仍然在顶级定格AllowDrop="true",并给它为dragOver处理程序,我可以更新装饰器的位置,但我还设置了在此处将DragDropEffects拖动到None。然后,我只需要将DragOver处理程序添加到实际放置目标中,以更新装饰者位置......并确保设置e.Handled = true,以便顶层网格的处理程序不会将效果设置回无在一个下降目标...

private void TopLevelGrid_OnDragOver(object sender, DragEventArgs e) 
{ 
UpdateDragAdornerPosition(e.GetPosition(topLevelGrid)); 
e.Effects = DragDropEffects.None; 
e.Handled = true; 
} 

private void DropTarget_OnDragOver(object sender, DragEventArgs e) 
{ 
UpdateDragAdornerPosition(e.GetPosition(topLevelGrid)); 
e.Handled = true; 
} 
+1

链接现在已经死了。 – 2015-09-17 17:04:04