UIElement.CapturePointer(Pointer) Méthode

Définition

Définit la capture de pointeur sur un élément UIElement. Une fois capturé, seul l’élément qui a la capture déclenche les événements liés au pointeur.

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

Paramètres

value
Pointer

Référence de l’objet pointeur.

Retours

Boolean

bool

true si l’objet a une capture de pointeur ; sinon, false.

Exemples

Cet exemple montre comment appeler CapturePointer en fonction de la gestion de PointerPressed. Il montre également un modèle pour le suivi et le comptage des références de pointeur.

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

Remarques

Vous ne pouvez capturer le pointeur que si ce pointeur est dans un état appuyé (Pointer.IsInContact doit avoir la valeur true). Ce qui constitue physiquement une pression varie en fonction du type d’appareil du pointeur (bouton de la souris enfoncé, point de contact vers le bas, stylet en contact). Si vous tentez de capturer un pointeur qui n’a pas été appuyé, ou si le pointeur a été précédemment appuyé, mais qu’il est maintenant libéré, CapturePointer retourne la valeur false. Les captures existantes ne sont pas affectées par un appel CapturePointer qui a retourné false.

Vous capturez généralement le pointeur dans un gestionnaire d’événements PointerPressed . Le pointeur instance que vous obtenez à partir des données d’événement PointerRoutedEventArgs de votre gestionnaire PointerPressed est la valeur que vous devez passer pour le paramètre value lorsque vous appelez CapturePointer à partir du code de votre gestionnaire.

Vous capturez généralement le pointeur, car vous souhaitez que l’action de pointeur actuelle lance un comportement dans votre application. Dans ce cas, vous ne souhaitez généralement pas que d’autres éléments gèrent d’autres événements provenant des actions de ce pointeur, jusqu’à ce que votre comportement soit terminé ou annulé en relâchant la capture de pointeur. Si un pointeur est capturé, seul l’élément qui a capturé obtient les événements d’entrée du pointeur, et les autres éléments ne déclenchent pas d’événements même si le pointeur se déplace dans leurs limites. Par exemple, considérez une interface utilisateur qui a deux éléments adjacents. Normalement, si vous déplacez le pointeur d’un élément à l’autre, vous obtenez d’abord les événements PointerMoved du premier élément, puis du deuxième élément. Mais si le premier élément a capturé le pointeur, le premier élément continue à recevoir des événements PointerMoved même si le pointeur capturé quitte ses limites. En outre, le deuxième élément ne déclenche pas d’événements PointerEntered pour un pointeur capturé lorsque le pointeur capturé y entre.

L’état de capture de pointeur et la génération des événements liés à la capture de pointeur ne sont pas entièrement liés au code de l’application. Si l’utilisateur libère le pointeur, cela génère un événement PointerReleased et les captures de pointeurs associées à ce pointeur sont perdues. Cela déclenche également PointerCaptureLost sur l’élément de capture d’origine.

Dans la plupart des cas, la capture de pointeur est automatiquement relâchée lorsque l’utilisateur termine une action d’entrée qui libère la capture de pointeur précédente (lever un point tactile, libérer le bouton gauche de la souris, retirer le stylet hors de portée). Une autre condition susceptible de libérer la capture est toute action qui déclenche également un événement PointerCanceled . Votre application peut généralement s’appuyer sur le comportement de capture-release associé aux actions d’entrée utilisateur, sans avoir à annuler spécifiquement une capture de pointeur avec ReleasePointerCapture ou ReleasePointerCaptures. Pour plus d’informations, voir Interactions avec la souris.

La méthode CapturePointer retourne false si le pointeur a déjà été capturé.

Un UIElement peut capturer plusieurs points de pointeur à la fois. Utilisez le paramètre value pour indiquer le pointeur instance que vous souhaitez capturer.

Les événements d’entrée qui représentent des mouvements (tels que Tapped ou DoubleTapped) ne sont généralement déclenchés qu’après la libération d’un pointeur. Vous ne devez donc pas tenter de capturer un pointeur dans les gestionnaires d’événements pour les événements de mouvement. La référence pointeur dans les données d’événement pour les événements de mouvement ne sera pas autorisée à lancer une capture de pointeur.

Conseil

N’essayez pas d’utiliser CapturePointer en dehors de l’étendue des gestionnaires d’événements d’entrée pertinents pour les pointeurs. À moins que vous n’ayez un pointeur associé à un pointeur autorisé à effectuer une capture de pointeur à ce moment-là, votre appel CapturePointer n’aura aucun effet. Il n’existe aucun moyen pratique de générer un nouveau pointeur et d’appeler CapturePointer à l’aide de ce nouveau pointeur. Vous devez utiliser uniquement les références de pointeur que le système vous fournit par le biais des données d’événement des événements d’entrée liés au pointeur.

S’applique à

Voir aussi