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;
}

Комментарии

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

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

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

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

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

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

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

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

Tip

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

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

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