VisualInteractionSource.TryRedirectForManipulation(PointerPoint) 方法

定义

指示应将给定指针流的配置操作发送到 InteractionTracker,而不是从给定 PointerPoint 开始的应用 UI 线程。

如果笔势与 VisualInteractionSource 上的配置匹配,则 TryRedirectForManipulation 使 VisualInteractionSource 能够将指针流重定向到 InteractionTracker。 只能使用 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 开始的应用 UI 线程。

示例

///////////////////////////////////////////////////////////////////////////////////////////////
//
// 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,应用程序将在 UIElement 上收到 PointerCaptureLost,或在 CoreWindow 上收到 PointerRoutedAway。 这些消息指示输入已从应用程序 UI 线程发送。 此方法最常在 PointerPressed 上调用。

PrecisionTouchpad 输入不需要此调用,如果 InputRedirectionMode 已设置为包含 CapableTouchpad 输入,则会自动路由到 InteractionTracker 以用于适当的手势。

限制

异步自然

此系统的性质是异步的。 当应用调用 TryRedirectForManipulation 并且调用到达合成器时,将有其他输入事件可能已进入应用程序的 UI 线程。 在大多数情况下,应用收到这些事件并不有害,开发人员可以选择手势检测应用端,以确定如何处理输入和缓解问题。 应用将通过接收 PointerCaptureLost 来了解系统操作是否接管 ,该事件与 ScrollViewer 今天接管输入处理时收到的事件相同。 此处的一个复杂情况是,像“快速轻拂”之类的手势 (只需短暂平移) 即可将整个输入流(包括 PointerReleased)发送到应用程序,然后合成器才能做出响应。 如果应用受到这些限制的影响,他们可以选择在其一侧执行一些手势检测,以确保行为正确。

与 XAML 控件逻辑集成

在上述快速轻拂方案中,平移恰好位于控件(如按钮)上,如果平移包含在按钮内,该按钮将检测为单击。 这与执行路由) 检测手势的系统 GestureRecognizer (略有不同。 为了确保快速轻拂类型方案在 XAML 中正常工作,开发人员需要侦听按钮上的 OnTapped,而不只是单击(如果按钮位于合成器交互区域内)。

合成器命中测试

用于确定操作是否在正确的视觉对象上发生的命中测试结果将基于合成器的命中测试。 合成器命中测试不如 XAML 命中测试可靠,因此在某些情况下,结果可能会略有差异。

有关更多详细信息,请参阅 VisualInteractionSource文档。

与冲突的自定义手势识别器集成

在内部,系统 GestureRecognizer 用于路由输入。 应用通常可以获取所需的行为,只要它们使用系统手势识别。 如果应用尝试使用与系统识别器冲突的自定义识别器,则可能存在冲突,即应用希望合成器接管,但不会。

适用于