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
Ссылка на объект указателя.
Возвращаемое значение
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 . Экземпляр указателя, полученный из данных PointerPressed
события PointerRoutedEventArgs обработчика, — это значение, которое необходимо передать для value
параметра при вызове CapturePointer
из кода обработчика.
Обычно указатель записывается, так как требуется, чтобы текущее действие указателя инициировало поведение в приложении. В этом случае вы обычно не хотите, чтобы другие элементы обрабатывали любые другие события, полученные от действий этого указателя, до тех пор, пока ваше поведение не будет завершено или отменено путем освобождения записи указателя. При захвате указателя только элемент, имеющий запись, получает входные события указателя, а другие элементы не запускают события, даже если указатель перемещается в их границы. Например, рассмотрим пользовательский интерфейс с двумя смежными элементами. Как правило, при перемещении указателя из одного элемента в другой сначала получаются события PointerMoved из первого элемента, а затем из второго элемента. Но если первый элемент захватил указатель, то первый элемент продолжает получать PointerMoved
события, даже если захваченный указатель покидает свои границы. Кроме того, второй элемент не запускает события Pointer Enter для захваченного указателя, когда захваченный указатель входит в него.
Состояние отслеживания указателя и создание событий, связанных с захватом указателя, не полностью зависит от кода приложения. Если пользователь отпускает указатель, то создается событие PointerReleased , а записи указателя, связанные с этим указателем, теряются. Это также запускает PointerCaptureLost в исходном элементе захвата.
В большинстве случаев захват указателя освобождается автоматически, когда пользователь завершает действие ввода, которое освобождает предыдущий захват указателя (подъем сенсорной точки, освобождение левой кнопки мыши, выведение пера за пределы диапазона). Еще одним условием, которое может освободить запись, является любое действие, которое также вызывает событие PointerCanceled . Как правило, приложение может полагаться на поведение, связанное с действиями ввода данных пользователем, без необходимости специально отменять захват указателя с помощью ReleasePointerCapture или ReleasePointerCaptures. Дополнительные сведения см. в статье Взаимодействие с помощью мыши.
Метод CapturePointer
вернет, false
если указатель уже был записан.
UIElement может захватывать несколько точек указателя одновременно. Используйте параметр , value
чтобы указать экземпляр указателя , который требуется записать.
События ввода, представляющие жесты (например , Tapped или DoubleTapped), обычно запускаются только после освобождения указателя, поэтому не следует пытаться записать указатель в обработчиках событий жестов. Ссылка на указатель в данных события для событий жестов не будет разрешена для запуска записи указателя.
Совет
Не пытайтесь использовать CapturePointer
вне область обработчиков событий ввода, относящихся к указателю. Если у вас нет указателя , который, как вы уверены, связан с указателем, которому разрешено записывать указатель в это время, вызов CapturePointer не будет иметь никакого эффекта. Практически невозможно создать новый Pointer
объект и вызвать CapturePointer
его с помощью этого указателя. Следует использовать Pointer
только те ссылки, которые система предоставляет вам через данные событий событий, связанных с указателем.