Teilen über


UIElement.CapturePointer(Pointer) Methode

Definition

Legt die Zeigererfassung auf ein UIElement fest. Nach der Erfassung löst nur das Element mit der Erfassung zeigerbezogene Ereignisse aus.

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

Parameter

value
Pointer

Der Verweis auf das Zeigerobjekt.

Gibt zurück

Boolean

bool

true , wenn das Objekt über eine Zeigererfassung verfügt; andernfalls false.

Beispiele

Dieses Beispiel zeigt das Aufrufen von CapturePointer basierend auf der Verarbeitung von PointerPressed. Außerdem wird ein Muster zum Nachverfolgen und Zählen von Zeigerbezügen angezeigt.

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

Hinweise

Sie können den Zeiger nur dann erfolgreich erfassen, wenn sich dieser Zeiger in einem gedrückten Zustand befindet (Pointer.IsInContact sollte true sein). Was das Drücken physisch ausmacht, hängt vom Typ des Zeigers ab (gedrückte Maustaste, Touchpoint nach unten, Stift in Kontakt). Wenn Sie versuchen, einen Zeiger zu erfassen, der nicht gedrückt wurde oder an dem der Zeiger zuvor gedrückt wurde, aber jetzt freigegeben wird, gibt CapturePointer false zurück. Vorhandene Aufzeichnungen werden nicht von einem CapturePointer-Aufruf beeinflusst, der false zurückgegeben hat.

Sie erfassen den Zeiger in der Regel in einem PointerPressed-Ereignishandler . Der Zeiger instance Sie aus den PointerRoutedEventArgs-Ereignisdaten Ihres PointerPressed-Handlers abrufen, ist der Wert, den Sie für den Wertparameter übergeben sollten, wenn Sie CapturePointer aus dem Code Ihres Handlers aufrufen.

Sie erfassen in der Regel den Zeiger, da die aktuelle Zeigeraktion ein Verhalten in Ihrer App initiieren soll. In diesem Fall möchten Sie in der Regel nicht, dass andere Elemente andere Ereignisse behandeln, die aus den Aktionen dieses Zeigers stammen, bis Ihr Verhalten entweder abgeschlossen oder durch Freigeben der Zeigererfassung abgebrochen wird. Wenn ein Zeiger erfasst wird, erhält nur das Element, das über eine Erfassung verfügt, die Eingabeereignisse des Zeigers, und andere Elemente lösen keine Ereignisse aus, auch wenn sich der Zeiger in ihre Grenzen bewegt. Betrachten Sie beispielsweise eine Benutzeroberfläche mit zwei benachbarten Elementen. Wenn Sie den Zeiger von einem Element zum anderen verschoben haben, erhalten Sie normalerweise zuerst PointerMoved-Ereignisse vom ersten Element und dann vom zweiten Element. Wenn das erste Element jedoch den Zeiger erfasst hat, empfängt das erste Element weiterhin PointerMoved-Ereignisse , auch wenn der erfasste Zeiger seine Grenzen verlässt. Außerdem löst das zweite Element keine PointerEntered-Ereignisse für einen erfassten Zeiger aus, wenn der erfasste Zeiger ihn eingibt.

Der Zeigererfassungszustand und das Generieren der Ereignisse, die sich auf die Zeigererfassung beziehen, sind nicht vollständig auf App-Code bezogen. Wenn der Benutzer den Zeiger loslässt, wird ein PointerReleased-Ereignis generiert, und die diesem Zeiger zugeordneten Zeigererfassungen gehen verloren. Dadurch wird auch PointerCaptureLost für das ursprüngliche Erfassungselement ausgelöst.

In den meisten Fällen wird die Zeigererfassung automatisch freigegeben, wenn der Benutzer eine Eingabeaktion abgeschlossen hat, die die vorherige Zeigeraufnahme freigibt (Anheben eines Touchpunkts, Loslassen der linken Maustaste, Aussetzen des Eingabestifts aus dem Bereich). Eine weitere Bedingung, die die Erfassung freigeben kann, ist jede Aktion, die auch ein PointerCanceled-Ereignis auslöst. Ihre App kann sich in der Regel auf das Aufzeichnungsfreigabeverhalten verlassen, das mit Benutzereingabeaktionen verknüpft ist, ohne eine Zeigererfassung mit ReleasePointerCapture oder ReleasePointerCaptures speziell abbrechen zu müssen. Weitere Informationen finden Sie unter Mausinteraktionen.

Die CapturePointer-Methode gibt false zurück, wenn der Zeiger bereits erfasst wurde.

Ein UIElement kann mehrere Zeigerpunkte gleichzeitig erfassen. Verwenden Sie den Wertparameter, um den Zeiger anzugeben, instance Sie erfassen möchten.

Die Eingabeereignisse, die Gesten darstellen (z. B . Getippt oder DoubleTapped), werden normalerweise erst ausgelöst, nachdem ein Zeiger freigegeben wurde. Daher sollten Sie nicht versuchen, einen Zeiger in Ereignishandlern für Gestenereignisse zu erfassen. Der Zeigerverweis in Ereignisdaten für Gestenereignisse darf keine Zeigererfassung initiieren.

Tipp

Versuchen Sie nicht, CapturePointer außerhalb des Bereichs zeigerrelevanter Eingabeereignishandler zu verwenden. Sofern Sie nicht über einen Zeiger verfügen, von dem Sie sicher sind, dass sie einem Zeiger zugeordnet ist, der zu diesem Zeitpunkt die Zeigererfassung zulassen darf, hat Ihr CapturePointer-Aufruf keine Auswirkung. Es gibt keine praktische Möglichkeit, einen neuen Zeiger zu generieren und CapturePointer mit diesem neuen Zeiger aufzurufen. Sie sollten nur die Zeigerverweise verwenden, die das System Ihnen über die Ereignisdaten der zeigerbezogenen Eingabeereignisse bereitstellt.

Gilt für:

Weitere Informationen