Comment faire glisser un UserControl à l'intérieur d'un Canvas
Je suis en train d'écrire ma première application WPF. J'ai une Toile dans laquelle l'utilisateur peut ajouter un UserControl sous-classes contenant un formulaire. L'utilisateur doit être en mesure de faire glisser ces UserControl autour de la Toile. Quelle est la meilleure pratique de le faire avec WPF?
Merci.
source d'informationauteur loris
Vous devez vous connecter pour publier un commentaire.
Ceci est fait dans silverlight et pas dans WPF, mais il devrait fonctionner de la même.
Créer deux propriétés privées sur le contrôle:
Puis attatch certains gestionnaires d'événements dans le constructeur de la commande:
Maintenant créer ces méthodes:
Quelques choses à noter ici:
1. Ce ne doit pas être dans une toile. Il peut être dans un stackpanel, ou de la grille.
2. Cela rend le contrôle entier déplaçable, ce qui signifie que si vous cliquez n'importe où dans le contrôle et faites-le glisser faites glisser le contrôle de l'ensemble. Vous ne savez pas si c'est exactement ce que vous voulez.
Edit-
L'expansion sur certains des détails à votre question:
La meilleure façon que j'ai mise en œuvre de cette est de créer une classe qui hérite de UserControl, peut-être appelé DraggableControl qui est construite avec ce code, puis tous les déplaçable contrôles devraient étendre la DraggableControl.
Edit 2 - Il y a un petit problème lorsque vous avez un datagrid dans ce contrôle. Si vous trier une colonne dans la grille de la MouseLeftButtonUp événement se déclenche jamais. J'ai mis à jour le code de sorte que isDragging est protégé. J'ai trouvé la meilleure solution est de combiner cette méthode anonyme à la LostMouseCapture cas de la grille de données:
Concernant Corey Sunwold solution - je me suis débarrassé de MouseUp et les événements MouseDown et je me suis simplifié la méthode MouseMove à l'aide de MouseButtonState comme ci-dessous 🙂 je suis en utilisant la Toile.SetLeft() et de la Toile.SetTop() à la place RenderTransform je n'ai pas besoin de stocker de l'ancienne position d'événement MouseDown.
Ce code fonctionne parfaitement!
Bouton Déplacer
Heureux de codage 😉
Corey réponse est la plupart du temps correct, mais il manque un élément essentiel: la mémoire de ce que la dernière transformation a été. Sinon, lorsque vous déplacez un élément, relâchez le bouton de la souris, puis cliquez sur cet élément nouveau, la transformation se remet à
(0,0)
et le contrôle revient à son origine.Voici une version légèrement modifiée qui fonctionne pour moi:
La clé est de stocker la précédente décalages X et Y, et puis de les utiliser pour augmenter le courant du mouvement de décalage pour arriver à la bonne agrégation de décalage.
J'ai eu quelques difficultés avec les solutions et qui a abouti à ceci:
Fondamentalement, c'est Corey exemple, mais tire parti des conseils de l'Hawlett. Il ne fonctionne que lorsque le conteneur parent est une Toile. Aussi, il mérite d'être pomponnée avec des limites à garder à l'utilisateur de faire glisser le contrôle à des endroits qu'il ne devrait vraiment pas être.