2010-01-19 4 views
3

J'utilise un Adorner pour montrer un « fantôme » de l'élément traîné ...Comment faire pour mettre à jour la position d'un drag adorner pendant WPF drag-n-drop?

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; 

... mais je ne peux pas trouver un moyen agréable de mettre à jour la position du Adorner pendant la traîne. Le plus proche que j'ai est en mettant AllowDrop="true" sur la grille de haut niveau et en lui donnant un gestionnaire de DragOver ...

private void TopLevelGrid_OnDragOver(object sender, DragEventArgs e) 
{ 
dragAdorner.UpdatePosition(e.GetPosition(topLevelGrid)); 
} 

Mais cela signifie que je ne suis pas le bon DragDropEffects des commentaires sur le curseur, par exemple, il affiche toujours le curseur DragDropEffects.Move au lieu de DragDropEffects.None jusqu'à ce que je dépasse une cible réelle.

Quelqu'un sait-il un meilleur moyen de mettre à jour la position adorner?

Répondre

6

Il ya this (malheureusement seulement disponible en version mise en cache), un vieux blogue de Bea Stollnitz, qui couvre à peu près votre question. Il a une belle implémentation de drag n drop avec un adorateur montrant une "image fantôme". Fondamentalement, le glisser-déposer dans WPF est une procédure compliquée qui, si vous voulez des DragAdorners personnalisés, implique l'ajout d'un tas de propriétés de dépendance attachées pour gérer la configuration de tous les événements impliqués et surtout pour afficher l'adorateur d'une manière qui n'interfère pas avec le code de chute.

Code de Bea fonctionne en ayant une classe d'aide qui définit le propriétaire de gestionnaire d'événements de DragOverWindow et AllowDrop juste avant l'opération de baisse de traînée réelle, de cette façon vous pouvez contrôler tout le mouvement entre la source de déplacement réelle et la cible de baisse .

3

Ainsi, en regardant de plus près Bea's code que redoced se référait à ...

je encore mis AllowDrop="true" sur la grille de haut niveau et lui donner un gestionnaire de DragOver où je peux mettre à jour la position de Adorner, mais je mis aussi DragDropEffects to None ici. Ensuite, j'ai juste besoin d'ajouter un gestionnaire DragOver à la cible actuelle pour mettre à jour la position de l'adorateur ... et de régler e.Handled = true pour que le gestionnaire de la grille de haut niveau ne rétablisse pas les effets à None quand je suis sur une cible de baisse ...

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

Le lien est maintenant mort. –

Questions connexes