VisualInteractionSource.TryRedirectForManipulation(PointerPoint) Metode

Definisi

Menunjukkan bahwa manipulasi yang dikonfigurasi untuk aliran pointer yang diberikan harus dikirim ke InteractionTracker, bukan utas UI aplikasi, dimulai dari PointerPoint yang diberikan.

TryRedirectForManipulation memungkinkan VisualInteractionSource untuk mengalihkan aliran Pointer ke InteractionTracker jika gerakan cocok dengan konfigurasi pada VisualInteractionSource. Metode ini hanya boleh dipanggil dengan input Pointer dari 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)

Parameter

pointerPoint
PointerPoint

Menunjukkan bahwa manipulasi yang dikonfigurasi untuk aliran pointer yang diberikan harus dikirim ke InteractionTracker, bukan utas UI aplikasi, dimulai dari PointerPoint yang diberikan.

Contoh

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

Keterangan

Metode ini memungkinkan aplikasi untuk menunjukkan bahwa sistem (Compositor) harus mengambil alih manipulasi yang dikonfigurasi untuk VisualInteractionSource tertentu. Ketika TryRedirectForManipulation dipanggil, bingkai dari yang diteruskan di PointerPoint digunakan sebagai titik awal untuk penanganan input InteractionTracker . Jika gerakan pengguna diuji ke visual yang terkait dengan VisualInteractionSource (atau salah satu anaknya), dan pengguna melakukan gerakan yang dikonfigurasi, maka sistem akan memanipulasi. Jika input diuji ke visual lain atau pengguna melakukan gerakan yang tidak dikonfigurasi, input akan dikirim ke CoreWindow dan melalui perutean input normal XAML.

Jika VisualInteractionSource mengalihkan aliran input ke InteractionTracker, aplikasi akan menerima PointerCaptureLost pada UIElement, atau PointerRoutedAway di CoreWindow. Pesan-pesan ini menunjukkan bahwa input telah dikirim dari utas UI aplikasi. Metode ini akan paling umum dipanggil pada PointerPressed.

Input PrecisionTouchpad tidak memerlukan panggilan ini dan akan secara otomatis dirutekan ke InteractionTracker untuk gerakan yang sesuai jika InputRedirectionMode telah diatur untuk menyertakan input CapableTouchpad.

Batasan

Alam Asinkron

Sifat sistem ini asinkron. Pada saat aplikasi memanggil TryRedirectForManipulation dan panggilan mencapai komppositori, akan ada peristiwa input tambahan yang dapat berhasil ke utas UI aplikasi. Dalam kebanyakan kasus, tidak berbahaya bagi aplikasi untuk menerima peristiwa ini, dan pengembang dapat memilih untuk gestur mendeteksi sisi aplikasi untuk menentukan cara menangani input dan mengurangi masalah. Aplikasi ini akan mengetahui apakah manipulasi sistem mengambil alih dengan menerima PointerCaptureLost—peristiwa yang sama yang diterima ketika ScrollViewer mengambil alih penanganan input hari ini. Salah satu komplikasi di sini adalah bahwa dimungkinkan untuk gerakan seperti "jentik cepat" (hanya panci pendek) untuk mengirim seluruh aliran input, termasuk PointerReleased, ke aplikasi sebelum komposit dapat merespons. Jika aplikasi terpengaruh oleh batasan ini, mereka dapat memilih untuk melakukan sejumlah deteksi gerakan di sisi mereka untuk memastikan perilaku yang tepat.

Integrasi dengan Logika Kontrol XAML

Dalam skenario jentik cepat yang dijelaskan di atas di mana wajan kebetulan berada di kontrol seperti tombol, tombol akan mendeteksi geser sebagai klik jika terkandung di dalam tombol. Ini sedikit berbeda dari bagaimana sistem GestureRecognizer (yang melakukan perutean) mendeteksi gerakan. Untuk memastikan skenario jenis jentik cepat berfungsi dengan benar dengan XAML, pengembang harus mendengarkan OnTapped pada tombol daripada hanya Klik jika berada dalam area interaksi komposit.

Pengujian Hit Komposit

Hasil hit-test yang digunakan untuk menentukan apakah manipulasi terjadi pada visual yang tepat akan didasarkan pada pengujian hit komposit. Pengujian hit komposit tidak sekuat pengujian hit XAML, sehingga ada kasus di mana hasilnya dapat memiliki sedikit perbedaan.

Lihat dokumentasi VisualInteractionSourceuntuk detail selengkapnya.

Integrasi Dengan Custom Gesture Recognizer yang Bertentangan

Secara internal, sistem GestureRecognizer digunakan untuk merutekan input. Aplikasi umumnya bisa mendapatkan perilaku yang mereka inginkan selama mereka menggunakan pengenalan gerakan sistem. Jika aplikasi mencoba menggunakan pengenal kustom yang bertentangan dengan pengenal sistem, mungkin ada konflik di mana aplikasi mengharapkan komposit mengambil alih dan tidak.

Berlaku untuk