Поделиться через


UIElement.CapturePointer(Pointer) Метод

Определение

Задает запись указателя на uiElement. После захвата события, связанные с указателем, будут запускаться только элемент, имеющий запись.

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

Параметры

value
Pointer

Ссылка на объект указателя.

Возвращаемое значение

Boolean

bool

Значение true , если объект имеет захват указателя; в противном случае — false.

Примеры

В этом примере показан вызов CapturePointer на основе обработки PointerPressed. Здесь также показан шаблон для отслеживания и подсчета ссылок на указатели.

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

Комментарии

Успешно записать указатель можно только в том случае, если он находится в состоянии нажатия (Значение Pointer.IsInContact должно иметь значение true). То, что физически представляет собой нажатие, зависит от типа устройства указателя (нажатие кнопки мыши, касание вниз, перо в контакте). При попытке записать указатель, который не нажат или где указатель был нажат ранее, но теперь отпускается, CapturePointer возвращает значение false. На существующие записи не влияет вызов CapturePointer, возвращающий значение false.

Обычно указатель записывается в обработчике событий PointerPressed . Экземпляр Указателя, полученный из данных события PointerRoutedEventArgs обработчика PointerPressed , является значением, которое необходимо передать для параметра value при вызове CapturePointer из кода обработчика.

Обычно указатель захватывает, так как требуется, чтобы текущее действие указателя инициировало поведение в приложении. В этом случае обычно не требуется, чтобы другие элементы обрабатывали другие события, поступающие от действий этого указателя, до тех пор, пока ваше поведение не будет завершено или отменено путем освобождения записи указателя. При захвате указателя только элемент, имеющий захват, получает входные события указателя, а другие элементы не запускают события, даже если указатель перемещается в их границы. Например, рассмотрим пользовательский интерфейс с двумя смежными элементами. Обычно при перемещении указателя из одного элемента в другой события PointerMoved сначала получаются из первого элемента, а затем из второго элемента. Но если первый элемент захватил указатель, то первый элемент продолжает получать события PointerMoved , даже если захваченный указатель покидает свои границы. Кроме того, второй элемент не вызывает события PointerEntered для захваченного указателя, когда захваченный указатель входит в него.

Состояние записи указателя и создание событий, связанных с захватом указателя, не полностью зависит от кода приложения. Если пользователь отпускает указатель, который создает событие PointerReleased , и записи указателя, связанные с этим указателем, теряются. Это также активирует PointerCaptureLost в исходном захватываемом элементе.

В большинстве случаев захват указателя освобождается автоматически, когда пользователь завершает действие ввода, которое освобождает предыдущий захват указателя (снятие сенсорной точки, освобождение левой кнопки мыши, выход пера за пределы диапазона). Другим условием, которое может освободить запись, является любое действие, которое также вызывает событие PointerCanceled . Приложение обычно может полагаться на поведение выпуска записи, связанное с действиями ввода данных пользователем, без необходимости специально отменять захват указателя с помощью ReleasePointerCapture или ReleasePointerCaptures. Дополнительные сведения см. в статье Взаимодействие с помощью мыши.

Метод CapturePointer возвращает значение false , если указатель уже записан.

UIElement может захватывать несколько точек указателя одновременно. Используйте параметр value , чтобы указать экземпляр указателя , который требуется записать.

События ввода, представляющие жесты (например , Tapped или DoubleTapped), обычно активируются только после освобождения указателя, поэтому не следует пытаться захватить указатель в обработчиках событий для событий жестов. Ссылка указателя в данных события для событий жестов не будет разрешена для запуска захвата указателя.

Совет

Не пытайтесь использовать CapturePointer вне область обработчиков событий ввода, относящихся к указателю. Если у вас нет указателя , который, как вы уверены, связан с указателем, которому разрешено записывать указатель в это время, вызов CapturePointer не будет иметь никакого эффекта. Практически невозможно создать новый указатель и вызвать CapturePointer с помощью этого нового указателя. Следует использовать только ссылки указателя , которые система предоставляет вам через данные события входных событий, связанных с указателем.

Применяется к

См. также раздел