2010-01-19 57 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