UIElement.CapturePointer(Pointer) Methode

Definition

Legt die Zeigererfassung auf ein UIElement fest. Nach der Erfassung löst nur das Element, das über capture verfügt, 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 Zeigerobjektverweis.

Gibt zurück

Boolean

bool

true , wenn das Objekt über zeiger capture verfügt; falseandernfalls .

Beispiele

In diesem Beispiel wird das Aufrufen CapturePointer basierend auf der Behandlung von PointerPressed veranschaulicht. Außerdem wird ein Muster zum Nachverfolgen und Zählen von Zeigerverweisen 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;
}

Hinweise

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

In der Regel erfassen Sie den Zeiger in einem PointerPressed-Ereignishandler . Der Zeiger instance, den Sie aus den PointerRoutedEventArgs-Ereignisdaten Ihres PointerPressed Handlers erhalten, ist der Wert, den Sie für den value Parameter übergeben sollten, wenn Sie aus dem Code Des Handlers aufrufenCapturePointer.

In der Regel erfassen Sie 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 von den Aktionen dieses Zeigers stammen, bis Ihr Verhalten entweder abgeschlossen oder durch Loslassen der Zeigererfassung abgebrochen wird. Wenn ein Zeiger erfasst wird, ruft nur das Element, das über capture verfügt, die Eingabeereignisse des Zeigers ab, und andere Elemente lösen keine Ereignisse aus, selbst wenn der Zeiger in ihre Grenzen bewegt wird. Betrachten Sie beispielsweise eine Benutzeroberfläche mit zwei angrenzenden Elementen. Wenn Sie den Zeiger von einem Element zum anderen verschoben haben, erhalten Sie in der Regel zuerst PointerMoved-Ereignisse aus dem ersten Element und dann vom zweiten Element. Wenn jedoch das erste Element den Zeiger erfasst hat, empfängt PointerMoved das erste Element weiterhin 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 Zeigererfassungsstatus und das Generieren der Ereignisse, die sich auf die Zeigererfassung beziehen, sind nicht vollständig auf App-Code bezogen. Wenn der Benutzer den Zeiger freigibt, wird ein PointerReleased-Ereignis generiert, und dem Zeiger zugeordnete 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 abschließt, die die vorherige Zeigeraufnahme freigibt (Anheben eines Berührungspunkts, Loslassen der linken Maustaste, Aufheben 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 Capture-Release-Verhalten verlassen, das mit Benutzereingabeaktionen verknüpft ist, ohne eine Zeigererfassung mit ReleasePointerCapture oder ReleasePointerCaptures abbrechen zu müssen. Weitere Informationen finden Sie unter Mausinteraktionen.

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

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

Die Eingabeereignisse, die Gesten darstellen (z. B. Getippt oder DoubleTapped), werden in der Regel erst ausgelöst, nachdem ein Zeiger losgelassen 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, außerhalb des Bereichs zeigerrelevanter Eingabeereignishandler zu verwenden CapturePointer . Sofern Sie nicht über einen Zeiger verfügen, von dem Sie sicher sind, dass er einem Zeiger zugeordnet ist, der zu diesem Zeitpunkt die Zeigererfassung verwenden darf, hat Ihr CapturePointer-Aufruf keine Auswirkungen. Es gibt keine praktische Möglichkeit, eine neue Pointer zu generieren und mit diesem neuen Zeiger aufzurufen CapturePointer . Sie sollten nur die Pointer Verweise verwenden, die das System Ihnen über die Ereignisdaten der zeigerbezogenen Eingabeereignisse bereitstellt.

Gilt für:

Weitere Informationen