Condividi tramite


UIElement.CapturePointer(Pointer) Metodo

Definizione

Imposta l'acquisizione del puntatore su un oggetto UIElement. Dopo l'acquisizione, solo l'elemento con acquisizione genera eventi correlati al puntatore.

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

Parametri

value
Pointer

Riferimento all'oggetto puntatore.

Restituisce

Boolean

bool

true se l'oggetto ha l'acquisizione del puntatore; in caso contrario, false.

Esempio

Questo esempio mostra la chiamata di CapturePointer in base alla gestione di PointerPressed. Mostra anche un modello per il rilevamento e il conteggio dei riferimenti del puntatore.

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

Commenti

È possibile acquisire correttamente il puntatore solo se il puntatore si trova in uno stato premuto (Pointer.IsInContact deve essere true). Ciò che fisicamente costituisce la pressione varia in base al tipo di dispositivo del puntatore (pulsante del mouse premuto, tocco verso il basso, stilo in contatto). Se si tenta di acquisire un puntatore che non viene premuto o quando il puntatore è stato premuto in precedenza ma viene rilasciato, CapturePointer restituisce false. Le acquisizioni esistenti non sono interessate da una chiamata capturePointer che ha restituito false.

In genere si acquisisce il puntatore all'interno di un gestore eventi PointerPressed . L'istanza del puntatore ottenuta dai dati dell'evento PointerRoutedEventArgs del gestore PointerPressed è il valore da passare per il parametro value quando si chiama CapturePointer dal codice del gestore.

In genere si acquisisce il puntatore perché si vuole che l'azione del puntatore corrente avvii un comportamento nell'app. In questo caso in genere non si vuole che altri elementi gestisca altri eventi provenienti dalle azioni del puntatore, fino a quando il comportamento non viene completato o annullato rilasciando l'acquisizione del puntatore. Se viene acquisito un puntatore, solo l'elemento con acquisizione ottiene gli eventi di input del puntatore e altri elementi non generano eventi anche se il puntatore si sposta nei limiti. Si consideri ad esempio un'interfaccia utente con due elementi adiacenti. In genere, se il puntatore è stato spostato da un elemento all'altro, si otterrà prima gli eventi PointerMoved dal primo elemento e quindi dal secondo elemento. Tuttavia, se il primo elemento ha acquisito il puntatore, il primo elemento continua a ricevere eventi PointerMoved anche se il puntatore acquisito lascia i limiti. Inoltre, il secondo elemento non genera eventi PointerEntered per un puntatore acquisito quando il puntatore acquisito lo immette.

Lo stato di acquisizione del puntatore e la generazione degli eventi correlati all'acquisizione del puntatore non è interamente fino al codice dell'app. Se l'utente rilascia il puntatore, che genera un evento PointerReleased e i puntatori associati a tale puntatore vengono persi. Viene attivato anche PointerCaptureLost sull'elemento di acquisizione originale.

Nella maggior parte dei casi l'acquisizione del puntatore verrà rilasciata automaticamente quando l'utente completa un'azione di input che rilascia l'acquisizione del puntatore precedente (sollevando un punto di tocco, rilasciando il pulsante sinistro del mouse, rimuovendo lo stilo dall'intervallo). Un'altra condizione che potrebbe rilasciare l'acquisizione è qualsiasi azione che genera anche un evento PointerCanceled . L'app in genere può basarsi sul comportamento di rilascio dell'acquisizione associato alle azioni di input dell'utente, senza dover annullare in modo specifico un'acquisizione del puntatore con ReleasePointerCaptures o ReleasePointerCaptures. Per altre info, vedi Interazioni tramite mouse.

Il metodo CapturePointer restituirà false se il puntatore è già stato acquisito.

Un UIElement può acquisire più di un punto puntatore alla volta. Usare il parametro value per indicare l'istanza del puntatore che si vuole acquisire.

Gli eventi di input che rappresentano movimenti (ad esempio Tapped o DoubleTapped) vengono in genere attivati solo dopo il rilascio di un puntatore, quindi non è consigliabile tentare di acquisire un puntatore nei gestori eventi per gli eventi di movimento. Il riferimento puntatore nei dati dell'evento per gli eventi di movimento non potrà avviare un'acquisizione del puntatore.

Suggerimento

Non provare a usare CapturePointer all'esterno dell'ambito dei gestori eventi di input pertinenti al puntatore. A meno che non si disponga di un puntatore che si è certi che sia associato a un puntatore autorizzato ad avere l'acquisizione del puntatore in quel momento, la chiamata di CapturePointer non avrà alcun effetto. Non esiste un modo pratico per generare un nuovo puntatore e chiamare CapturePointer usando quel nuovo puntatore. È consigliabile usare solo il puntatore che fa riferimento al sistema tramite i dati dell'evento degli eventi di input correlati al puntatore.

Si applica a

Vedi anche