次の方法で共有


VisualInteractionSource.TryRedirectForManipulation(PointerPoint) メソッド

定義

特定のポインター ストリームに対して構成された操作を、指定された PointerPoint から開始して、アプリの UI スレッドではなく InteractionTracker に送信する必要があることを示します。

TryRedirectForManipulation を使用すると、ジェスチャが VisualInteractionSource の構成と一致する場合、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

特定のポインター ストリームに対して構成された操作を、指定された PointerPoint から開始して、アプリの UI スレッドではなく InteractionTracker に送信する必要があることを示します。

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

注釈

このメソッドを使用すると、アプリは、特定の VisualInteractionSource に対して構成された操作をシステム (コンポジター) が引き継ぐ必要があることを示します。 TryRedirectForManipulation が呼び出されると、PointerPoint で渡された フレームが InteractionTracker の入力処理の開始点として使用されます。 ユーザーのジェスチャが VisualInteractionSource (またはその子のいずれか) に関連付けられているビジュアルにヒット テストされ、ユーザーが構成されたジェスチャを実行すると、システムは操作します。 入力が別のビジュアルにヒット テストされる場合、またはユーザーが構成されていないジェスチャを実行した場合、入力は CoreWindow に送信され、XAML の通常の入力ルーティングを介して送信されます。

VisualInteractionSource が入力ストリームを InteractionTracker に再ルーティングする場合、アプリケーションは UIElement の PointerCaptureLost または CoreWindow の PointerRoutedAway を受け取ります。 これらのメッセージは、入力がアプリケーション UI スレッドから送信されたことを示します。 このメソッドは、PointerPressed で最も一般的に呼び出されます。

PrecisionTouchpad 入力では、この呼び出しは必要ありません。InputRedirectionMode が CapableTouchpad 入力を含むように設定されている場合、適切なジェスチャの InteractionTracker に自動的にルーティングされます。

制限事項

非同期の性質

このシステムの性質は非同期です。 アプリが TryRedirectForManipulation を呼び出し、呼び出しがコンポジターに到達するまでに、アプリケーションの UI スレッドに追加の入力イベントが発生する可能性があります。 ほとんどの場合、アプリがこれらのイベントを受信しても有害ではなく、開発者はジェスチャ検出アプリ側を選択して、入力の処理方法を決定し、懸念事項を軽減できます。 アプリは、システム操作が PointerCaptureLost を受け取ることによって引き継ぐかどうかを認識します。これは、ScrollViewer が現在の入力処理を引き継ぐときに受信したのと同じイベントです。 ここでの複雑さの 1 つは、コンポジターが応答する前に、"クイック フリック" (短いパン) のようなジェスチャが、PointerReleased を含む入力ストリーム全体をアプリケーションに送信できることです。 アプリがこれらの制限の影響を受ける場合は、適切な動作を保証するために、ある程度のジェスチャ検出を自分の側で行うことを選択できます。

XAML コントロール ロジックとの統合

上で説明したクイック フリック シナリオでは、パンがボタンのようなコントロール上にある場合、ボタンがボタン内に含まれている場合、パンがクリックとして検出されます。 これは、システムの GestureRecognizer (ルーティングを実行している) がジェスチャを検出する方法とは少し異なります。 クイック フリックの種類のシナリオが XAML で正しく動作するようにするために、開発者は、コンポジターの相互作用領域内にある場合は Click だけでなく、ボタンで OnTapped をリッスンする必要があります。

コンポジター のヒット テスト

適切なビジュアルで操作が行われているかどうかを判断するために使用されるヒット テストの結果は、コンポジターのヒット テストに基づいています。 コンポジター のヒット テストは XAML ヒット テストほど堅牢でないため、結果に若干の不一致が生じる場合があります。

詳細については、 VisualInteractionSourceのドキュメントを参照してください。

競合するカスタム ジェスチャ認識エンジンとの統合

内部的には、入力のルーティングにシステム GestureRecognizer が使用されています。 通常、アプリは、システム ジェスチャ認識を使用している限り、必要な動作を取得できます。 アプリがシステム認識エンジンと競合するカスタム認識エンジンを使用しようとしている場合、コンポジターが引き継ぐとアプリが予期し、引き継がれない競合が発生する可能性があります。

適用対象