1

A l'aide de la boîte à outils Silverlight 4, est-il possible de faire glisser et déposer d'un ListBox vers un Canvas (et d'obtenir un événement sur le drop dans le Canvas)?Glisser/déposer de ListBoxDragDropTarget à PanelDragDropTarget

J'ai été en mesure d'écrire du code à glisser/déposer à partir d'un panneau de retour à l'intérieur d'un PanelDragDropTarget vers un canevas, mais le gestionnaire d'événements ne s'est pas déclenché lorsque la suppression s'est produite. Lorsque j'ai essayé de glisser/déposer d'un ListBox à l'intérieur d'un ListBoxDragDrop sur le Canevas à l'intérieur du PanelDragDropTarget, la suppression ne s'est pas produite (et le gestionnaire d'événements n'a pas déclenché). Tout en faisant glisser le Canvas, le curseur devient celui avec les flèches haut/bas.

Merci, Ted

Répondre

2

Après l'étape décrite dans le poste il y a encore un petit problème de Mohamed. Lorsque vous survolez l'élément Panel cible, l'indicateur glisser-déposer ressemble à celui de l'opération de défilement (et j'avais besoin de celui avec une flèche - pour l'opération de déplacement). Pour se débarrasser de cet effet, j'ai créé une classe dérivée de PanelDragDropTarget où j'ai remplacé deux méthodes qui ont causé le problème.

public class FixedPanelDragDropTarget : PanelDragDropTarget 
{ 
    protected override bool CanAddItem(Panel itemsControl, object data) 
    { 
     return true; 
    } 

    protected override void InsertItem(Panel itemsControl, int index, object data) 
    { 
     // 
    } 

} 

Après que le gestionnaire d'événement FixedPanelDragDropTarget.Drop nous pouvons créer manuellement un intance de l'élément tombé, tandis que le reste a l'air comme il était censé le faire.

+0

Oh mon Dieu, c'est une bonne chose. J'ai lutté pendant des heures pour obtenir un élément TreeViewDragDrop à être accepté par mon PanelDragDropTarget, votre solution a bien fonctionné. –

1

Ce problème se produit car ListBoxDragDropTarget et PanelDragDropTarget sont écrits différemment. Lorsque vous faites glisser entre 2 ListBoxDragDropTargets vous transférez l'élément de données lié au contrôle, tandis que glisser entre 2 PanelDragDropTargets transfère l'UIElement qui est "ramassé".

C'est pourquoi la réponse de Dmitriyz est requise. Le PanelDragDropTarget vérifie si l'élément que vous avez déplacé à partir de ListBoxDragDropTarget est un UIElement, et comme ce n'est pas le cas, il s'agit simplement d'une simple donnée, elle renvoie false pour CanAddItem. Cela désactive la possibilité de laisser tomber. Par conséquent, vous voyez le curseur avec les flèches haut/bas. Pour que tout fonctionne, vous devez hériter de PanelDragDropTarget et utiliser cette classe enfant à la place. Il doit au moins remplacer la méthode CanAddItem:

public class ElementDragDropTarget : PanelDragDropTarget 
{ 
    protected override bool CanAddItem(Panel itemsControl, object data) 
    { 
     return true; 
    } 

    protected override void InsertItem(Panel itemsControl, int index, object data) 
    { 
     // Do Work 
    } 
} 
+1

Oh mec, c'est une bonne chose. J'ai lutté pendant des heures pour obtenir un élément TreeViewDragDrop à être accepté par mon PanelDragDropTarget, votre solution a bien fonctionné. –