UIElement.CapturePointer(Pointer) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
public:
virtual bool CapturePointer(Pointer ^ value) = CapturePointer;
bool CapturePointer(Pointer const& value);
public bool CapturePointer(Pointer value);
function capturePointer(value)
Public Function CapturePointer (value As Pointer) As Boolean
Parámetros
- value
- Pointer
Referencia del objeto de puntero.
Devoluciones
bool
true
si el objeto tiene captura de puntero; de lo contrario, false
.
Ejemplos
En este ejemplo se muestra una llamada CapturePointer
basada en el control de PointerPressed. También muestra un patrón para el seguimiento y el recuento de referencias de puntero.
int _pointerCount;
public Scenario2()
{
this.InitializeComponent();
bEnteredExited.PointerEntered += bEnteredExited_PointerEntered;
bEnteredExited.PointerExited += bEnteredExited_PointerExited;
bEnteredExited.PointerPressed += bEnteredExited_PointerPressed;
bEnteredExited.PointerReleased += bEnteredExited_PointerReleased;
bEnteredExited.PointerMoved += bEnteredExited_PointerMoved;
// To code for multiple Pointers (that is, fingers),
// we track how many entered/exited.
_pointerCount = 0;
}
private void bEnteredExited_PointerMoved(object sender,
PointerRoutedEventArgs e)
{
Scenario2UpdateVisuals(sender as Border, "Moved");
}
private void bEnteredExited_PointerReleased(object sender,
PointerRoutedEventArgs e)
{
((Border)sender).ReleasePointerCapture(e.Pointer);
txtCaptureStatus.Text = string.Empty;
}
//Can only get capture on PointerPressed (i.e. touch down, mouse click, pen press)
private void bEnteredExited_PointerPressed(object sender,
PointerRoutedEventArgs e)
{
if (tbPointerCapture.IsOn)
{
bool _hasCapture = ((Border)sender).CapturePointer(e.Pointer);
txtCaptureStatus.Text = "Got Capture: " + _hasCapture;
}
}
private void bEnteredExited_PointerExited(object sender,
PointerRoutedEventArgs e)
{
_pointerCount--;
Scenario2UpdateVisuals(sender as Border, "Exited");
}
private void bEnteredExited_PointerEntered(object sender,
PointerRoutedEventArgs e)
{
_pointerCount++;
Scenario2UpdateVisuals(sender as Border, "Entered");
}
private void Scenario2UpdateVisuals(Border border,
String eventDescription)
{
switch (eventDescription.ToLower())
{
case "exited":
if (_pointerCount <= 0)
{
border.Background = new SolidColorBrush(Colors.Red);
bEnteredExitedTextBlock.Text = eventDescription;
}
break;
case "moved":
RotateTransform rt =
(RotateTransform)bEnteredExitedTimer.RenderTransform;
rt.Angle += 2;
if (rt.Angle > 360) rt.Angle -= 360;
break;
default:
border.Background = new SolidColorBrush(Colors.Green);
bEnteredExitedTextBlock.Text = eventDescription;
break;
}
}
private void Scenario2Reset(object sender, RoutedEventArgs e)
{
Scenario2Reset();
}
private void Scenario2Reset()
{
bEnteredExited.Background = new SolidColorBrush(Colors.Green);
bEnteredExitedTextBlock.Text = string.Empty;
}
Comentarios
Solo puede capturar correctamente el puntero si ese puntero está en un estado presionado (Pointer.IsInContact debe ser true
). Lo que constituye físicamente la presión variará en función del tipo de dispositivo de puntero (botón del mouse presionado, punto táctil hacia abajo, lápiz óptico en contacto). Si intenta capturar un puntero que no está presionado o donde el puntero se presionó anteriormente, pero ahora está liberado, CapturePointer devuelve false
. Las capturas existentes no se ven afectadas por una CapturePointer
llamada que devolvió false
.
Normalmente, se captura el puntero dentro de un controlador de eventos PointerPressed . La instancia de Puntero que obtiene de los datos del evento PointerRoutedEventArgs del PointerPressed
controlador es el valor que debe pasar para el value
parámetro cuando se llama CapturePointer
desde el código del controlador.
Normalmente, capturas el puntero porque quieres que la acción de puntero actual inicie un comportamiento en la aplicación. En este caso, normalmente no desea que otros elementos controlen ningún otro evento que provengan de las acciones de ese puntero, hasta que el comportamiento se complete o se cancele liberando la captura del puntero. Si se captura un puntero, solo el elemento que tiene captura obtiene los eventos de entrada del puntero y otros elementos no activan eventos aunque el puntero se mueva a sus límites. Por ejemplo, considere una interfaz de usuario que tiene dos elementos adyacentes. Normalmente, si mueves el puntero de un elemento a otro, primero obtendrías los eventos PointerMoved del primer elemento y, a continuación, desde el segundo elemento. Pero si el primer elemento ha capturado el puntero, el primer elemento continúa recibiendo PointerMoved
eventos incluso si el puntero capturado deja sus límites. Además, el segundo elemento no desencadena eventos PointerEntered para un puntero capturado cuando el puntero capturado entra en él.
El estado de captura del puntero y la generación de los eventos relacionados con la captura de puntero no es totalmente el código de la aplicación. Si el usuario libera el puntero, que genera un evento PointerReleased y se pierden las capturas de puntero asociadas a ese puntero. Esto también desencadena PointerCaptureLost en el elemento de captura original.
En la mayoría de los casos, la captura del puntero se liberará automáticamente cuando el usuario complete una acción de entrada que libere la captura del puntero anterior (levantando un punto táctil, liberando el botón izquierdo del mouse, sacando el lápiz óptico fuera del intervalo). Otra condición que podría liberar la captura es cualquier acción que también active un evento PointerCanceled . La aplicación normalmente puede basarse en el comportamiento de captura y versión asociado a las acciones de entrada del usuario, sin tener que cancelar específicamente una captura de puntero con ReleasePointerCapture o ReleasePointerCaptures. Para obtener más información, consulta Interacciones de mouse.
El CapturePointer
método devolverá false
si el puntero ya se ha capturado.
Un UIElement puede capturar más de un punto de puntero a la vez. Use el value
parámetro para indicar la instancia de puntero que desea capturar.
Los eventos de entrada que representan gestos (como Tapped o DoubleTapped) normalmente solo se activan después de liberar un puntero, por lo que no debe intentar capturar un puntero en controladores de eventos para eventos de gestos. No se permitirá que la referencia de puntero en los datos de eventos de eventos de gestos inicie una captura de puntero.
Sugerencia
No intente usar CapturePointer
fuera del ámbito de los controladores de eventos de entrada relevantes para el puntero. A menos que tenga un puntero que esté seguro de que está asociado a un puntero que puede tener captura de puntero en ese momento, la llamada a CapturePointer no tendrá ningún efecto. No hay ninguna manera práctica de generar un nuevo Pointer
puntero y llamar CapturePointer
a con ese nuevo puntero. Solo debe usar las Pointer
referencias que el sistema proporciona a través de los datos de eventos de los eventos de entrada relacionados con el puntero.