Meine Frage ist zweifach und ich hoffe, dass es für beide von WPF bereitgestellte Lösungen einfacher gibt als für die Standardlösungen von WinForms (die Christophe Geers bereitgestellt hat, bevor ich diese Klarstellung vorgenommen habe).
Gibt es eine Möglichkeit, das Fenster ziehbar zu machen, ohne Ereignisse mit Mausklick und Ziehen zu erfassen und zu verarbeiten? Ich meine, das Fenster kann über die Titelleiste gezogen werden, aber wenn ich ein Fenster so einstelle, dass es keines hat und es trotzdem ziehen kann, gibt es eine Möglichkeit, die Ereignisse einfach irgendwie auf das zu lenken, was das Ziehen der Titelleiste behandelt ?
Zweitens gibt es eine Möglichkeit, einen Ereignishandler auf alle Elemente im Fenster anzuwenden? Machen Sie das Fenster wie in ziehbar, unabhängig davon, auf welches Element der Benutzer klickt + zieht. Natürlich ohne den Handler manuell zu jedem einzelnen Element hinzuzufügen. Mach es einfach einmal irgendwo?
quelle
MouseLeftButtonDown
Ereignis festlegen , anstatt die .cs einzuchecken?MouseLeftButtonDown
es eine direkte Routing-Strategie undMouseDown
eine sprudelnde Routing-Strategie hat. Weitere Informationen und einige zusätzliche Dinge, die Sie beachten sollten, wenn Sie over verwenden, finden Sie im Abschnitt "Anmerkungen" auf der MSDN-Seite für MouseLeftButtonDown .MouseLeftButtonDown
MouseDown
Wenn das wpf-Formular unabhängig davon, wo es angeklickt wurde, ziehbar sein muss, wird bei der einfachen Umgehung ein Delegat verwendet, um die DragMove () -Methode entweder für das Windows-Onload-Ereignis oder das Grid-Load-Ereignis auszulösen
quelle
DragMove
Maustaste auf eine beliebige Stelle im Formular klicken, da diese nur aufgerufen werden kann, wenn die primäre Maustaste gedrückt ist.Manchmal haben wir keinen Zugriff auf
Window
, z. B. wenn wir verwendenDevExpress
, ist nur a verfügbarUIElement
.Schritt 1: Fügen Sie eine angehängte Eigenschaft hinzu
Die Lösung ist:
MouseMove
Ereignisse ein;Window
..DragMove()
unseren neu entdeckten anWindow
.Code:
Schritt 2: Fügen Sie jedem Element eine angehängte Eigenschaft hinzu, damit es das Fenster ziehen kann
Der Benutzer kann das gesamte Fenster ziehen, indem er auf ein bestimmtes Element klickt, wenn wir diese angehängte Eigenschaft hinzufügen:
Anhang A: Optionales erweitertes Beispiel
In diesem Beispiel von DevExpress ersetzen wir die Titelleiste eines Docking-Fensters durch unser eigenes graues Rechteck und stellen dann sicher, dass das Fenster normal gezogen wird, wenn der Benutzer auf das graue Rechteck klickt und es zieht:
Haftungsausschluss: Ich bin nicht mit DevExpress verbunden . Diese Technik funktioniert mit jedem Benutzerelement, einschließlich Standard-WPF oder Telerik (einem anderen guten WPF-Bibliotheksanbieter).
quelle
Löst in einigen Fällen eine Ausnahme aus (dh wenn Sie im Fenster auch ein anklickbares Bild haben, das beim Klicken ein Meldungsfeld öffnet. Wenn Sie das Meldungsfeld verlassen, wird eine Fehlermeldung angezeigt). Die Verwendung ist sicherer
Sie sind also sicher, dass die linke Taste in diesem Moment gedrückt wird.
quelle
e.LeftButton
anstattMouse.LeftButton
speziell die Schaltfläche zu verwenden, die den Ereignisargumenten zugeordnet ist, obwohl es wahrscheinlich nie wichtig sein wird.Sie können ein Formular ziehen und ablegen, indem Sie auf eine beliebige Stelle im Formular klicken, nicht nur auf die Titelleiste. Dies ist praktisch, wenn Sie ein randloses Formular haben.
Dieser Artikel über CodeProject zeigt eine mögliche Lösung, um dies zu implementieren:
http://www.codeproject.com/KB/cs/DraggableForm.aspx
Grundsätzlich wird ein Nachkomme des Formulartyps erstellt, in dem Ereignisse mit der Maus nach unten, oben und nach oben behandelt werden.
Und hier ist eine ähnliche Lösung, die in einem Video-Tutorial erklärt wird:
http://www.youtube.com/watch?v=tJlY9aX73Vs
Ich würde das Ziehen des Formulars nicht zulassen, wenn ein Benutzer auf ein Steuerelement in diesem Formular klickt. Benutzer zeigen unterschiedliche Ergebnisse an, wenn sie auf unterschiedliche Steuerelemente klicken. Wenn sich mein Formular plötzlich bewegt, weil ich auf ein Listenfeld, eine Schaltfläche, eine Beschriftung usw. geklickt habe. das wäre verwirrend.
quelle
Wie bereits von @ fjch1997 erwähnt, ist es praktisch, ein Verhalten zu implementieren. Hier ist die Kernlogik dieselbe wie in der Antwort von @ loi.efy :
Verwendung:
quelle
Das ist alles nötig!
quelle
Die nützlichste Methode, sowohl für WPF- als auch für Windows-Formulare, Beispiel für WPF:
quelle
Quelle
quelle