Wie ziehen Sie ein Benutzersteuerelement in einem Canvas
Schreibe ich meine erste WPF-Anwendung. Ich habe einen Canvas-Bereich, in dem der Benutzer hinzufügen können UserControl Unterklassen mit einem Formular. Benutzer sollten in der Lage sein, ziehen Sie diese UserControl auf der Leinwand. Was ist die beste Praxis zu tun, diese mit WPF?
Danke.
InformationsquelleAutor loris | 2009-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht in silverlight und nicht in WPF, aber es sollte die gleiche Arbeit.
Erstellen Sie zwei private Eigenschaften für das Steuerelement:
Dann attatch einige event-Handler im Konstruktor des Steuerelements:
Erstellen Sie nun diejenigen Methoden:
Ein paar Dinge hier zu beachten:
1. Dies muss nicht in einem canvas. Es kann in einem stackpanel oder raster.
2. Dies macht die gesamte Steuerung gezogen werden kann, das heißt, wenn Sie klicken Sie irgendwo in das Steuerelement und ziehen Sie es ziehen Sie die gesamte Kontrolle. Nicht sicher, ob das ist genau das, was Sie wollen.
Bearbeiten
Die Erweiterung auf einige Details in deiner Frage:
Der beste Weg, die würde ich umsetzen, das ist eine Klasse erstellen, erbt von UserControl, vielleicht genannt DraggableControl gebaut ist, dass Sie mit diesem code, dann alle ziehbar Bedienelemente verlängern die DraggableControl.
Edit 2 - Es ist klein Problem sein, wenn Sie ein datagrid-Objekt in diesem Steuerelement. Wenn Sie die Sortierung einer Spalte im datagrid die MouseLeftButtonUp-Ereignis nie ausgelöst wird. Ich aktualisierte den code, so dass isDragging geschützt ist. Ich fand die beste Lösung ist, binden Sie diese anonyme Methode, um die LostMouseCapture-Ereignis des datagrid:
Gut gemacht! Mit einigen geringfügigen änderungen in der mouse-move-handler funktioniert es perfekt. Vielen Dank!
Ich bin daran interessiert zu hören, was die änderungen, die Sie machen musste, und warum du Sie gemacht hast. Ich habe genau dieses code in einigen Projekten bereits und es hat gut funktioniert. Vielleicht gibt es etwas, das ich übersehen.
Das hat mir wirklich geholfen. Ich danke Ihnen sehr für dieses posting.
In
Control_MouseLeftButtonDown
fand ich, dass ich brauchte, um zu ersetzenclickPosition = e.GetPosition(this);
mitclickPosition = e.GetPosition(this.Parent as UIElement);
. Bevor Sie das ändern, Elemente, die ich angeklickt würde, springt nach unten und rechts (da war es immer eine Startposition innerhalb der Grenzen des Elements selbst, anstatt die hosting-Leinwand).InformationsquelleAutor Corey Sunwold
Bezüglich Corey Sunwold Lösung - ich losgeworden, MouseUp und MouseDown-Ereignisse und ich vereinfachte Methode MouseMove mit MouseButtonState wie unten 🙂 ich bin mit der Leinwand.SetLeft() und Canvas.SetTop() statt RenderTransform, so brauche ich nicht speichern, alte position vom MouseDown-Ereignis.
tatsächlich wie kommst du auf die X-und Y-Abstand zu bewegen, ohne das MouseDown-Ereignis?
Ich nach unten gestimmt, weil Sie nicht den code. Ich hatte das gleiche problem wie Duncan, und du scheinbar die Lösung gefunden.... Sie wollte sich einfach nicht zeigen.
InformationsquelleAutor Hawlett
Corey Antwort ist meist korrekt, aber es fehlt ein entscheidendes element: die Erinnerung an die Letzte Transformation war. Andernfalls, wenn Sie ein Element verschoben, lassen Sie die Maustaste Los, und klicken Sie dann auf das Element wieder, die Transformation setzt auf
(0,0)
und die Steuerung springt dann zurück zu Ihrem Ursprung.Hier ist eine leicht modifizierte version, die funktioniert für mich:
Der Taste wird die Speicherung der vorhergehenden X-und Y-offsets, und dann mit Ihnen zu ergänzen, die die aktuelle Bewegung offset um dann die richtige Aggregat versetzt.
InformationsquelleAutor DonBoitnott
Dieser code funktioniert perfekt!
Taste Bewegen
Happy coding 😉
InformationsquelleAutor
Hatte ich einige Probleme mit den angegebenen Lösungen und endete mit:
Es ist im Grunde Corey Beispiel, aber nutzt Hinweise von Hawlett. Es funktioniert NUR, wenn der übergeordnete container ist eine Canvas. Auch verdient es zu sein, aufgedonnerte, mit einigen Grenzen zu halten, die Nutzer aus: ziehen Sie die Steuerung zu Orten, sollte es wirklich nicht sein.
Ja, es wurde geschrieben mit einigen Einschränkungen. Es funktionierte gut für mich in der definierten Umgebung.
InformationsquelleAutor Wally Hynds
Implementiert habe ich dies für WPF und UWP store-app. Und fügte hinzu, Sie alle den code im user control selbst, statt die Steuerung, die benutzt wird, können Sie es ändern, wie par.
WPF
Button_MouseLeftButtonDown ist das click-Ereignis der Schaltfläche, über die Sie möchten, ziehen Sie das Steuerelement.
UWP
Ellipse_PointerPressed ist das click-Ereignis der ellipse, durch die Sie möchten, ziehen Sie das Steuerelement.
InformationsquelleAutor Rahul Sonone