Compartir a través de


UIElement.CapturePointer(Pointer) Método

Definición

Establece la captura de puntero en un uiElement. Una vez capturado, solo el elemento que tiene captura activará eventos relacionados con el puntero.

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

Boolean

bool

true si el objeto tiene captura de puntero; de lo contrario, false.

Ejemplos

En este ejemplo se muestra cómo llamar a CapturePointer en función del 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;
}
Private _pointerCount As Integer

Public Sub New()
    Me.InitializeComponent()
    AddHandler bEnteredExited.PointerEntered, AddressOf bEnteredExited_PointerEntered
    AddHandler bEnteredExited.PointerExited, AddressOf bEnteredExited_PointerExited
    AddHandler bEnteredExited.PointerPressed, AddressOf bEnteredExited_PointerPressed
    AddHandler bEnteredExited.PointerReleased, AddressOf bEnteredExited_PointerReleased
    AddHandler bEnteredExited.PointerMoved, AddressOf bEnteredExited_PointerMoved

    'To code for multiple Pointers (i.e. Fingers) we track how many entered/exited.
    _pointerCount = 0
End Sub

''' <summary>
''' Invoked when this page is about to be displayed in a Frame.
''' </summary>
''' <param name="e">Event data that describes how this page was reached.  The Parameter
''' property is typically used to configure the page.</param>
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
End Sub

Private Sub bEnteredExited_PointerMoved(sender As Object, e As PointerRoutedEventArgs)
    Scenario2UpdateVisuals(TryCast(sender, Border), "Moved")
End Sub

Private Sub bEnteredExited_PointerReleased(sender As Object, e As PointerRoutedEventArgs)
    DirectCast(sender, Border).ReleasePointerCapture(e.Pointer)
    txtCaptureStatus.Text = String.Empty
End Sub

'Can only get capture on PointerPressed (i.e. touch down, mouse click, pen press)
Private Sub bEnteredExited_PointerPressed(sender As Object, e As PointerRoutedEventArgs)
    If tbPointerCapture.IsOn Then
        Dim _hasCapture As Boolean = DirectCast(sender, Border).CapturePointer(e.Pointer)
        txtCaptureStatus.Text = "Got Capture: " & _hasCapture
    End If
End Sub

Private Sub bEnteredExited_PointerExited(sender As Object, e As PointerRoutedEventArgs)
    _pointerCount -= 1
    Scenario2UpdateVisuals(TryCast(sender, Border), "Exited")
End Sub

Private Sub bEnteredExited_PointerEntered(sender As Object, e As PointerRoutedEventArgs)
    _pointerCount += 1
    Scenario2UpdateVisuals(TryCast(sender, Border), "Entered")

End Sub

Private Sub Scenario2UpdateVisuals(border As Border, eventDescription As String)
    Select Case eventDescription.ToLower()
        Case "exited"
            If _pointerCount <= 0 Then
                border.Background = New SolidColorBrush(Colors.Red)
                bEnteredExitedTextBlock.Text = eventDescription
            End If
            Exit Select
        Case "moved"

            Dim rt As RotateTransform = DirectCast(bEnteredExitedTimer.RenderTransform, RotateTransform)
            rt.Angle += 2
            If rt.Angle > 360 Then
                rt.Angle -= 360
            End If
            Exit Select
        Case Else
            border.Background = New SolidColorBrush(Colors.Green)
            bEnteredExitedTextBlock.Text = eventDescription
            Exit Select

    End Select
End Sub

Private Sub Scenario2ResetMethod(sender As Object, e As RoutedEventArgs)
    Reset()
End Sub

Private Sub Reset()
    bEnteredExited.Background = New SolidColorBrush(Colors.Green)
    bEnteredExitedTextBlock.Text = String.Empty
End Sub

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 se libera, CapturePointer devuelve false. Las capturas existentes no se ven afectadas por una llamada de CapturePointer 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 controlador PointerPressed es el valor que debe pasar para el parámetro value al llamar a 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 eventos PointerMoved 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 método CapturePointer 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 parámetro value 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 puntero y llamar a CapturePointer con ese nuevo puntero. Solo debe usar las referencias de puntero que el sistema proporciona a través de los datos de eventos de los eventos de entrada relacionados con el puntero.

Se aplica a

Consulte también