GestureRecognizer 类

定义

提供手势和操作识别、事件侦听器和设置。

public ref class GestureRecognizer sealed
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
class GestureRecognizer final
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class GestureRecognizer final
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class GestureRecognizer final
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
public sealed class GestureRecognizer
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
public sealed class GestureRecognizer
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class GestureRecognizer
function GestureRecognizer()
Public NotInheritable Class GestureRecognizer
继承
Object Platform::Object IInspectable GestureRecognizer
属性

Windows 要求

设备系列
Windows 10 (在 10.0.10240.0 中引入)
API contract
Windows.Foundation.UniversalApiContract (在 v1.0 中引入)

示例

在这里,我们设置了一个 GestureRecognizer 对象,其中包含用于处理指针和笔势输入的输入事件处理程序的集合。 有关如何侦听和处理Windows 运行时事件的详细信息,请参阅事件和路由事件概述。 有关完整实现,请参阅 基本输入示例

class ManipulationInputProcessor
{
    GestureRecognizer recognizer;
    UIElement element;
    UIElement reference;
    TransformGroup cumulativeTransform;
    MatrixTransform previousTransform;
    CompositeTransform deltaTransform;

    public ManipulationInputProcessor(GestureRecognizer gestureRecognizer, UIElement target, UIElement referenceFrame)
    {
        recognizer = gestureRecognizer;
        element = target;
        reference = referenceFrame;
        // Initialize the transforms that will be used to manipulate the shape
        InitializeTransforms();
        // The GestureSettings property dictates what manipulation events the
        // Gesture Recognizer will listen to.  This will set it to a limited
        // subset of these events.
        recognizer.GestureSettings = GenerateDefaultSettings();
        // Set up pointer event handlers. These receive input events that are used by the gesture recognizer.
        element.PointerPressed += OnPointerPressed;
        element.PointerMoved += OnPointerMoved;
        element.PointerReleased += OnPointerReleased;
        element.PointerCanceled += OnPointerCanceled;
        // Set up event handlers to respond to gesture recognizer output
        recognizer.ManipulationStarted += OnManipulationStarted;
        recognizer.ManipulationUpdated += OnManipulationUpdated;
        recognizer.ManipulationCompleted += OnManipulationCompleted;
        recognizer.ManipulationInertiaStarting += OnManipulationInertiaStarting;
    }

    public void InitializeTransforms()
    {
        cumulativeTransform = new TransformGroup();
        deltaTransform = new CompositeTransform();
        previousTransform = new MatrixTransform() { Matrix = Matrix.Identity };
        cumulativeTransform.Children.Add(previousTransform);
        cumulativeTransform.Children.Add(deltaTransform);
        element.RenderTransform = cumulativeTransform;
    }

    // Return the default GestureSettings for this sample
    GestureSettings GenerateDefaultSettings()
    {
        return GestureSettings.ManipulationTranslateX |
            GestureSettings.ManipulationTranslateY |
            GestureSettings.ManipulationRotate |
            GestureSettings.ManipulationTranslateInertia |
            GestureSettings.ManipulationRotateInertia;
    }

    // Route the pointer pressed event to the gesture recognizer.
    // The points are in the reference frame of the canvas that contains the rectangle element.
    void OnPointerPressed(object sender, PointerRoutedEventArgs args)
    {
        // Set the pointer capture to the element being interacted with so that only it
        // will fire pointer-related events
        element.CapturePointer(args.Pointer);
        // Feed the current point into the gesture recognizer as a down event
        recognizer.ProcessDownEvent(args.GetCurrentPoint(reference));
    }

    // Route the pointer moved event to the gesture recognizer.
    // The points are in the reference frame of the canvas that contains the rectangle element.
    void OnPointerMoved(object sender, PointerRoutedEventArgs args)
    {
        // Feed the set of points into the gesture recognizer as a move event
        recognizer.ProcessMoveEvents(args.GetIntermediatePoints(reference));
    }

    // Route the pointer released event to the gesture recognizer.
    // The points are in the reference frame of the canvas that contains the rectangle element.
    void OnPointerReleased(object sender, PointerRoutedEventArgs args)
    {
        // Feed the current point into the gesture recognizer as an up event
        recognizer.ProcessUpEvent(args.GetCurrentPoint(reference));
        // Release the pointer
        element.ReleasePointerCapture(args.Pointer);
    }

    // Route the pointer canceled event to the gesture recognizer.
    // The points are in the reference frame of the canvas that contains the rectangle element.
    void OnPointerCanceled(object sender, PointerRoutedEventArgs args)
    {
        recognizer.CompleteGesture();
        element.ReleasePointerCapture(args.Pointer);
    }

    // When a manipulation begins, change the color of the object to reflect
    // that a manipulation is in progress
    void OnManipulationStarted(object sender, ManipulationStartedEventArgs e)
    {
        Border b = element as Border;
        b.Background = new SolidColorBrush(Windows.UI.Colors.DeepSkyBlue);
    }

    // Process the change resulting from a manipulation
    void OnManipulationUpdated(object sender, ManipulationUpdatedEventArgs e)
    {
        previousTransform.Matrix = cumulativeTransform.Value;
        // Get the center point of the manipulation for rotation
        Point center = new Point(e.Position.X, e.Position.Y);
        deltaTransform.CenterX = center.X;
        deltaTransform.CenterY = center.Y;
        // Look at the Delta property of the ManipulationDeltaRoutedEventArgs to retrieve
        // the rotation, X, and Y changes
        deltaTransform.Rotation = e.Delta.Rotation;
        deltaTransform.TranslateX = e.Delta.Translation.X;
        deltaTransform.TranslateY = e.Delta.Translation.Y;
    }

    // When a manipulation that's a result of inertia begins, change the color of the
    // the object to reflect that inertia has taken over
    void OnManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
    {
        Border b = element as Border;
        b.Background = new SolidColorBrush(Windows.UI.Colors.RoyalBlue);
    }

    // When a manipulation has finished, reset the color of the object
    void OnManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
    {
        Border b = element as Border;
        b.Background = new SolidColorBrush(Windows.UI.Colors.LightGray);
    }

    // Modify the GestureSettings property to only allow movement on the X axis
    public void LockToXAxis()
    {
        recognizer.CompleteGesture();
        recognizer.GestureSettings |= GestureSettings.ManipulationTranslateY | GestureSettings.ManipulationTranslateX;
        recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateY;
    }

    // Modify the GestureSettings property to only allow movement on the Y axis
    public void LockToYAxis()
    {
        recognizer.CompleteGesture();
        recognizer.GestureSettings |= GestureSettings.ManipulationTranslateY | GestureSettings.ManipulationTranslateX;
        recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateX;
    }

    // Modify the GestureSettings property to allow movement on both the X and Y axes
    public void MoveOnXAndYAxes()
    {
        recognizer.CompleteGesture();
        recognizer.GestureSettings |= GestureSettings.ManipulationTranslateX | GestureSettings.ManipulationTranslateY;
    }

    // Modify the GestureSettings property to enable or disable inertia based on the passed-in value
    public void UseInertia(bool inertia)
    {
        if (!inertia)
        {
            recognizer.CompleteGesture();
            recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateInertia | GestureSettings.ManipulationRotateInertia;
        }
        else
        {
            recognizer.GestureSettings |= GestureSettings.ManipulationTranslateInertia | GestureSettings.ManipulationRotateInertia;
        }
    }

    public void Reset()
    {
        element.RenderTransform = null;
        recognizer.CompleteGesture();
        InitializeTransforms();
        recognizer.GestureSettings = GenerateDefaultSettings();
    }
}

示例

存档的示例

注解

可以在应用启动时为每个适当的元素创建手势对象。 但是,此方法可能无法很好地缩放,具体取决于需要创建的手势对象的数量 (例如,) 包含数百块的拼图。

在这种情况下,可以在 pointerdown 事件上动态创建手势对象,并在 MSGestureEnd 事件上销毁它们。 此方法可很好地缩放,但由于创建和释放这些对象,会产生一些开销。

或者,可以静态分配和动态管理可重用手势对象的池。

注意

此类不是敏捷类,这意味着需要考虑其线程模型和封送处理行为。 有关详细信息,请参阅线程处理和封送处理 (C++/CX) 在多线程环境中使用 Windows 运行时 对象 (.NET)

有关如何使用跨幻灯片功能的更多详细信息,请参阅 交叉幻灯片指南。 下图中显示了横向滑动交互使用的阈值距离。

显示选择和拖放过程的屏幕截图。

仅当检测到单个指针输入时,才会使用 PivotRadiusPivotCenter 属性。 它们对多个指针输入没有影响。 应在交互期间定期更新这些属性的值。

仅当通过 GestureSettings 属性设置 manipulationRotate 时,GestureRecognizer 才支持旋转。

如果 PivotRadius 的值设置为 0,则单指针输入不支持旋转。

版本历史记录

Windows 版本 SDK 版本 已添加值
2004 19041 HoldMaxContactCount
2004 19041 HoldMinContactCount
2004 19041 HoldRadius
2004 19041 HoldStartDelay
2004 19041 TapMaxContactCount
2004 19041 TapMinContactCount
2004 19041 TranslationMaxContactCount
2004 19041 TranslationMinContactCount

构造函数

GestureRecognizer()

初始化 GestureRecognizer 对象的新实例。

属性

AutoProcessInertia

获取或设置一个值,该值指示是否自动生成惯性期间的操作。

CrossSlideExact

获取或设置一个值,该值指示是否报告从交叉滑动交互的初始接触到结束的确切距离。默认情况下,从系统报告的跨滑交互的第一个位置中减去小距离阈值。 如果设置了此标志,则不会从初始位置减去距离阈值。

注意

此距离阈值旨在说明在初始检测后接触点的任何轻微移动。 它可帮助系统区分交叉滑动和平移,并帮助确保点击手势也不会被解释为两者。

CrossSlideHorizontally

获取或设置一个值,该值指示横滑轴是否为水平。

CrossSlideThresholds

获取或设置指示 CrossSliding 交互的距离阈值的值。

GestureSettings

获取或设置一个值,该值指示应用程序支持的手势和操作设置。

HoldMaxContactCount

获取或设置识别 Windows.UI.Input.GestureRecognizer.Holding 事件所需的最大接触点数。

HoldMinContactCount

获取或设置识别 Windows.UI.Input.GestureRecognizer.Holding 事件所需的最小接触点数。

HoldRadius

获取或设置为 Windows.UI.Input.GestureRecognizer.Holding 事件识别的接触点的半径。

HoldStartDelay

获取或设置 Windows.UI.Input.GestureRecognizer.Holding 事件识别联系人的时间阈值。

InertiaExpansion

获取或设置一个值,该值指示在调整大小或缩放完成) 时,从惯性开始到惯性结束 (对象大小的相对变化。

InertiaExpansionDeceleration

获取或设置一个值,该值指示在调整大小或扩展操作完成) 时,从惯性开始到惯性结束 (的减速速率。

InertiaRotationAngle

获取或设置一个值,该值指示当旋转操作完成) 时,在惯性 (结束时对象的最终旋转角度。

InertiaRotationDeceleration

获取或设置一个值,该值指示当旋转操作完成) 时,从惯性开始到惯性结束 (的减速率。

InertiaTranslationDeceleration

获取或设置一个值,该值指示转换操作完成时从惯性开始到惯性结束 () 减速率。

InertiaTranslationDisplacement

获取或设置一个值,该值指示当转换操作完成) 时,对象的屏幕位置从惯性开始到惯性结束 (的相对变化。

IsActive

获取一个值,该值指示是否正在处理交互。

IsInertial

获取一个值,该值指示在惯性期间是否仍在处理操作, (没有活动输入点) 。

ManipulationExact

获取或设置一个值,该值指示是否报告从初始接触到交互结束的确切距离。 默认情况下,从系统报告的第一个增量中减去较小的距离阈值。 此距离阈值旨在考虑在处理点击手势时接触点的轻微移动。 如果设置了此标志,则不会从第一个增量中减去距离阈值。

MouseWheelParameters

获取与鼠标设备的滚轮按钮关联的一组属性。

PivotCenter

获取或设置当检测到单个指针输入时旋转交互的中心点。

PivotRadius

获取或设置从 透视中心 到指针输入的半径,以便在检测到单个指针输入时进行旋转交互。

ShowGestureFeedback

获取或设置一个值,该值指示在交互期间是否显示视觉反馈。

TapMaxContactCount

获取或设置识别 Windows.UI.Input.GestureRecognizer.Tapped 事件所需的最大接触点数。

TapMinContactCount

获取或设置识别 Windows.UI.Input.GestureRecognizer.Tapped 事件所需的最小接触点数。

TranslationMaxContactCount

获取或设置识别翻译 (或平移) 事件所需的最大接触点数。

TranslationMinContactCount

获取或设置识别翻译 (或平移) 事件所需的最小接触点数。

方法

CanBeDoubleTap(PointerPoint)

标识是否仍可将点击解释为双击手势的第二次点击。

CompleteGesture()

使手势识别器完成交互。

ProcessDownEvent(PointerPoint)

处理指针输入,并引发适用于由 GestureSettings 属性指定的手势和操作的指针向下操作的 GestureRecognizer 事件。

ProcessInertia()

执行惯性计算并引发各种惯性事件。

ProcessMouseWheelEvent(PointerPoint, Boolean, Boolean)

处理指针输入,并引发适用于由 GestureSettings 属性指定的手势和操作的鼠标滚轮操作的 GestureRecognizer 事件。

ProcessMoveEvents(IVector<PointerPoint>)

处理指针输入,并引发适用于由 GestureSettings 属性指定的笔势和操作的指针移动操作的 GestureRecognizer 事件。

ProcessUpEvent(PointerPoint)

处理指针输入,并引发适用于由 GestureSettings 属性指定的手势和操作的指针向上操作的 GestureRecognizer 事件。

事件

CrossSliding

当用户在仅支持沿单轴平移的内容区域内通过单个触摸接触) 执行 滑动轻扫 手势 (时发生。 手势必须以垂直于此平移轴的方向发生。

注意

轻扫是一种短滑动手势,它会导致选择操作,而较长的滑动手势越过距离阈值并导致重新排列操作。 下图演示了轻扫和滑动手势。 显示选择和拖动操作的关系图。

Dragging

当用户使用鼠标或笔/触笔 (单个接触) 执行 滑动轻扫 手势时发生。

Holding

当用户使用一次触摸、鼠标或笔/触笔接触) 执行按住手势 (时发生。

ManipulationCompleted

当提升输入点并且通过惯性 (平移、扩展或旋转) 的所有后续运动已结束时发生。

ManipulationInertiaStarting

当在操作过程中抬起所有接触点,并且操作速度足以启动惯性行为, (转换、扩展或旋转在) 提升输入指针后继续时发生。

ManipulationStarted

当一个或多个输入点已启动并且随后的运动 (平移、扩展或旋转) 已开始时发生。

ManipulationUpdated

在启动一个或多个输入点且后续运动 (平移、扩展或旋转) 进行之后发生。

RightTapped

无论输入设备如何,指针输入都解释为右键单击手势时发生。

  • 鼠标右键单击
  • 笔筒按钮单击
  • 触摸或笔长按
Tapped

当指针输入被解释为点击手势时发生。

适用于

另请参阅