Was bedeutet es, die Maus in WPF zu erfassen?

73

Auf System.Windows.UIElementgibt es eine CaptureMouse()und eine gepaarte ReleaseMouseCapture()Methode. In diesem WPF DragDrop- Beispiel rufen sie CaptureMouse bei MouseDown auf und geben es bei MouseUp frei. Die Dokumentation in MSDN ist so nutzlos wie sie kommt - "CaptureMouse -> Erfasst die Maus."

Bevor ich es versuchte, nahm ich in meinem Kopf an, dass es die Maus irgendwie innerhalb der UIElement-Grenzen verriegelte, aber das ist eindeutig nicht der Fall, wenn ich es versuche. Vom Experimentieren scheint es etwas damit zu tun zu haben, auf Ereignisse zu reagieren, wenn sich die Maus außerhalb des UIElement befindet, aber kein Frachtkult-Programmierer sein möchte. Ich möchte es nicht nur verwenden, weil das Beispiel es tut, möchte ich eine maßgebliche Beschreibung dessen, was es bedeutet.

Finsternis
quelle
Überlegen Sie, wie Sie die Größe eines in einem Grafikeditor gezeichneten Elements ändern (allgemeiner bearbeiten) können. Wenn Sie die Größe mithilfe der Ecken des Begrenzungsrahmens ändern und eine Ecke außerhalb der Zeichenfläche ziehen möchten, müssen Sie die Maus erfassen, um weiterhin Mausereignisse zu empfangen, wenn der Mauszeiger das Zeichenflächenelement verlassen hat.
Minuten

Antworten:

81

Vom Erfassen und Entschlüsseln der Maus auf MSDN:

Wenn ein Objekt die Maus erfasst, werden alle mausbezogenen Ereignisse so behandelt, als würde das Objekt mit der Mauserfassung das Ereignis ausführen, selbst wenn sich der Mauszeiger über einem anderen Objekt befindet.

Nur das Erfassungssteuerelement empfängt die Mausereignisse bis zur Freigabe.

Das Erfassen der Maus ist nützlich zum Ziehen, da der gesamte Ziehcode in einem Steuerelement vorhanden sein kann, anstatt auf mehrere Steuerelemente verteilt zu sein.

Cameron MacFarland
quelle
16
Das Wichtigste bei der Capture-Maus ist, dass nur die Capture-Steuerung Mausereignisse empfängt.
Lukas Cenovsky
1
Solch eine sehr wichtige Information wird in MSDN nicht erwähnt
user1034912
12

Wenn die Maus erfasst wurde, empfängt ein Steuerelement Mausereignisse, auch wenn sich der Mauszeiger nicht mehr in seinem Begrenzungsbereich befindet.

In der Regel wird es verwendet für:

  • Drag & Drop
  • Tasten (zur Handhabung der Maus nach oben, wenn Sie die Maus auf die Taste legen und die Maus bewegen, bevor Sie die Taste loslassen)
Alun Harford
quelle
4

Die Silverlight 2-Dokumentation dafür enthält eine ausführlichere Beschreibung. Ich weiß nicht, warum sie nicht auch Teil der 3.5-Dokumentationsseite ist:

Wenn ein Objekt die Maus erfasst hat, erhält dieses Objekt eine Mauseingabe, unabhängig davon, ob sich der Mauszeiger innerhalb seines Begrenzungsbereichs befindet oder nicht. Die Maus wird normalerweise nur während simulierter Ziehvorgänge erfasst.
...

Dies funktioniert genauso mit WPF. Der Grund für die Verwendung mit DragDrop ist, dass das Gerät dem zu ziehenden Steuerelement Bericht erstattet, wenn sich die Maus möglicherweise außerhalb dieses Steuerelements befindet. Wenn Sie MyCanvas.Capture () und Capture (Null) auskommentieren (wodurch es gelöscht wird), können Sie nicht mehr löschen.

rmoore
quelle
1
In der von Ihnen zitierten SL-Dokumentation heißt es: "Die Maus wird normalerweise nur während simulierter Ziehvorgänge erfasst." - Was ist eine "simulierte Drag-Operation" und wie unterscheidet sie sich von einer echten? Vielen Dank.
Sabuncu