wpf events mouse

¿Qué significa "Capturar el mouse" en WPF?



events (3)

Cuando haya capturado el mouse, un control recibirá los eventos del mouse incluso si el puntero del mouse ya no está dentro de su área delimitadora.

Por lo general, se usa para:

  • Arrastrar y soltar
  • Botones (para manejar Mouse Up cuando coloca el mouse sobre el botón y mueve el mouse antes de soltar el botón)

En System.Windows.UIElement hay un CaptureMouse() y un ReleaseMouseCapture() emparejado de ReleaseMouseCapture() . En esta muestra de WPF DragDrop , llaman a CaptureMouse en MouseDown y lo liberan en MouseUp. La documentación en MSDN es tan inútil como viene: "CaptureMouse -> Captura el mouse".

En mi cabeza antes de intentarlo, supuse que de alguna manera bloqueaba el mouse dentro de los límites de UIElement, pero claramente no es el caso cuando lo intento. De experimentar, parece tener algo que ver con responder a eventos cuando el mouse está fuera del UIElement, pero no queriendo ser un programador de culto a la carga . No quiero usarlo simplemente porque el ejemplo sí, me gustaría. una descripción autorizada de lo que significa.


Desde Capture y Descapture the Mouse en MSDN:

Cuando un objeto captura el mouse, todos los eventos relacionados con el mouse se tratan como si el objeto con captura de mouse realizara el evento, incluso si el puntero del mouse está sobre otro objeto.

La captura del mouse es útil para arrastrar porque solo el control de captura recibe los eventos del mouse hasta que se libera. Todo el código de arrastre puede existir en un control, en lugar de estar distribuido en varios controles.


La documentación de Silverlight 2 tiene una descripción más detallada, no sé por qué no forma parte de la página de documentación 3.5:

Cuando un objeto ha capturado el mouse, ese objeto recibe la entrada del mouse, independientemente de si el puntero del mouse está dentro de su área delimitadora. El mouse generalmente solo se captura durante las operaciones de arrastre simuladas.
...

Funciona igual con WPF, por lo que la razón por la que se usa con DragDrop es que sabe cómo informar al control que se está arrastrando cuando el mouse puede estar fuera de ese control. Si comenta MyCanvas.Capture () y Capture (Null) (que lo borra), ya no puede soltar.