¿Qué significa "Capturar el ratón" en WPF?


En System.Windows.UIElement hay CaptureMouse() y un pares ReleaseMouseCapture() método. En este ejemplo WPF DragDrop llaman CaptureMouse en MouseDown y lo liberan en MouseUp. La documentación en MSDN es casi tan inútil como viene - "CaptureMouse -> Captura el ratón."

En mi cabeza antes de probarlo asumí que de alguna manera bloqueaba el ratón 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 de UIElement, pero no querer ser un programador de culto de carga No quiero usarlo simplemente porque el ejemplo lo hace, me gustaría una descripción autorizada de lo que significa.

Author: Eclipse, 2009-06-03

3 answers

Desde Captura y Descaptura el ratón en MSDN:

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

Capturar el ratón es útil para arrastrar porque solo el control de captura recibe los eventos del ratón hasta que se libera. Todo el código de arrastre puede existir en el único control, en lugar de extenderse sobre múltiples controles.

 72
Author: Cameron MacFarland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-02 23:18:17

Cuando ha capturado el ratón, un control recibirá eventos del ratón incluso si el puntero del ratón ya no está dentro de su área límite.

Normalmente, se usa para:

  • Arrastrar y soltar
  • Botones (para manejar el ratón hacia arriba cuando se pone el ratón sobre el botón y mover el ratón antes de soltar el botón)
 11
Author: Alun Harford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-02 23:19:38

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

Cuando un objeto ha capturado el ratón, ese objeto recibe la entrada del ratón independientemente de que el puntero del ratón esté o no dentro de su área delimitadora. Por lo general, el ratón 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 es así como el sabe informar al control que está siendo arrastrado desde cuando el ratón puede estar fuera de ese control. Si comentas las myCanvas.Capture () y la Captura (Null) (que lo borra), entonces ya no puede soltar.

 4
Author: rmoore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-02 23:18:48