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


VisualInteractionSource.TryRedirectForManipulation(PointerPoint) Метод

Определение

Указывает, что настроенные манипуляции для заданного потока указателя должны отправляться в InteractionTracker, а не в поток пользовательского интерфейса приложения, начиная с заданного pointerPoint.

TryRedirectForManipulation позволяет VisualInteractionSource перенаправлять поток указателя в InteractionTracker , если жест соответствует конфигурации VisualInteractionSource. Этот метод следует вызывать только с вводом указателя устройства DeviceType Touch.

public:
 virtual void TryRedirectForManipulation(PointerPoint ^ pointerPoint) = TryRedirectForManipulation;
void TryRedirectForManipulation(PointerPoint const& pointerPoint);
public void TryRedirectForManipulation(PointerPoint pointerPoint);
function tryRedirectForManipulation(pointerPoint)
Public Sub TryRedirectForManipulation (pointerPoint As PointerPoint)

Параметры

pointerPoint
PointerPoint

Указывает, что настроенные манипуляции для заданного потока указателя должны отправляться в InteractionTracker, а не в поток пользовательского интерфейса приложения, начиная с заданного pointerPoint.

Примеры

///////////////////////////////////////////////////////////////////////////////////////////////
//
// The following sample describes how to configure a visual to follow input/gestures.  
//
// This is accomplished in three main steps:
//
// 1) Creating a InteractionTracker and setting (or binding) its boundaries.
//
// 2) Creating at least one Interaction source and associating it with the InteractionTracker.
//
// 3) Taking the output of the InteractionTracker and applying it to a Visual's Offset and Scale 
//    properties.
//
// 4) Telling the system to try to handle the manipulation when the PointerPressed occurs
//
///////////////////////////////////////////////////////////////////////////////////////////////

void SetupSimpleInteractionTracker(Visual containerVisual, Visual contentVisual)
{
  //
  // Create the InteractionTracker and set its min/max position and scale.  These could 
  // also be bound to expressions.  Note: The scrollable area can be changed from either 
  // end to facilitate content updates/virtualization.
  //

  _tracker = InteractionTracker.Create(_compositor);

  _tracker.MaxPosition = new Vector3(
  contentVisual.Size.X - containerVisual.Size.X,
  contentVisual.Size.Y - containerVisual.Size.Y,
  0.0f);

  _tracker.MinScale = 0.5f;
  _tracker.MaxScale = 4.0f;


  //
  // Configure the interaction source.  Enable input with inertia on all axes.
  //

  _interactionSource = VisualInteractionSource.Create(_compositor, containerVisual);

  _interactionSource.PositionXSourceMode = InteractionSourceMode.EnabledWithInertia;
  _interactionSource.PositionYSourceMode = InteractionSourceMode.EnabledWithInertia;
  _interactionSource.ScaleSourceMode = InteractionSourceMode.EnabledWithInertia;

  _tracker.InteractionSources.Add(_interactionSource);

  //
  // Register for the pointer pressed event so that we can tell the system to handle the
  // manipulations.
  //

  _rootElement.PointerPressed += OnPointerPressedBasic;

  //
  // Bind the InteractionTracker outputs to the contentVisual.
  //

  var positionExpression = _compositor.CreateExpressionAnimation("-tracker.Position");
  positionExpression.SetReferenceParameter("tracker", _tracker);

  contentVisual.StartAnimation("Offset", positionExpression);


  var scaleExpression = _compositor.CreateExpressionAnimation("Vector3(tracker.Scale, tracker.Scale, 1.0)");

  scaleExpression.SetReferenceParameter("tracker", _tracker);

  contentVisual.StartAnimation("Scale", scaleExpression);
}

private void OnPointerPressedBasic(object sender, PointerRoutedEventArgs e)
{
  //
  // Try to handle the manipulation in the system.
  //
  if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch)
  {       
    _interactionSource.TryRedirectForManipulation(
    e.CurrentPoint.GetCurrentPoint(_rootElement));
  }
}

Compositor _compositor = null;
InteractionTracker _tracker = null;
UIElement _rootElement = null;
VisualInteractionSource _interactionSource;

Комментарии

Этот метод позволяет приложению указать, что система (Compositor) должна взять на себя все настроенные манипуляции для данного VisualInteractionSource. При вызове TryRedirectForManipulation кадр из переданного в PointerPoint используется в качестве отправной точки для обработки входных данных InteractionTracker . Если жест пользователя проверяется на попадание в визуальный элемент, связанный с VisualInteractionSource (или одним из его дочерних элементов), и пользователь выполняет настроенный жест, система будет манипулировать. Если входные данные проверяются на другой визуальный элемент или пользователь выполняет ненастроенный жест, то входные данные будут отправлены в CoreWindow и через обычную маршрутизацию ввода XAML.

Если VisualInteractionSource перенаправит входной поток в InteractionTracker, приложение получит PointerCaptureLost в UIElement или PointerRoutedAway в CoreWindow. Эти сообщения указывают, что входные данные были отправлены из потока пользовательского интерфейса приложения. Этот метод чаще всего вызывается в PointerPressed.

Входные данные PrecisionTouchpad не требуют этого вызова и будут автоматически перенаправляться в InteractionTracker для соответствующих жестов, если inputRedirectionMode был настроен на включение входных данных CapableTouchpad.

Ограничения

Асинхронная природа

Эта система является асинхронной. К тому времени, когда приложение вызывает TryRedirectForManipulation и вызов достигает композитора, будут возникать дополнительные события ввода, которые могли бы сделать его в потоке пользовательского интерфейса приложения. В большинстве случаев получение этих событий не является вредным для приложения, и разработчик может выбрать жест обнаружения стороны приложения, чтобы определить, как обрабатывать входные данные и устранять проблемы. Приложение будет знать, берет ли на себя управление системами, получая PointerCaptureLost — то же самое событие, полученное, когда ScrollViewer берет на себя обработку входных данных сегодня. Одна из усложнений заключается в том, что жест, такой как "быстрый щелчок" (просто короткий сдвиг), может отправить весь входной поток, включая PointerReleased, в приложение до того, как композитатор сможет ответить. Если на приложение влияют эти ограничения, он может выбрать некоторое обнаружение жестов на своей стороне, чтобы обеспечить правильное поведение.

Интеграция с логикой элементов управления XAML

В описанном выше сценарии быстрого щелчка, когда сдвиг находится на элементе управления, например кнопке, кнопка обнаруживает сдвиг как щелчок, если он содержится в кнопке. Это немного отличается от того, как система GestureRecognizer (которая выполняет маршрутизацию) обнаруживает жесты. Чтобы обеспечить правильную работу сценариев быстрого щелчка с XAML, разработчикам потребуется прослушивать onTapped на кнопке, а не просто щелкать, если она находится в области взаимодействия с составителем.

Compositor Hit-testing

Результат проверки попадания, используемый для определения того, выполняется ли манипуляция в правильном визуальном элементе, будет основываться на проверке попадания композитатора. Компоновочное тестирование попадания не так надежно, как тестирование нажатия XAML, поэтому бывают случаи, когда результаты могут иметь небольшое расхождение.

Дополнительные сведения см. в документации по VisualInteractionSource.

Интеграция с конфликтующими пользовательскими распознавателями жестов

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

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