信息
您所需的主题如下所示。但此主题未包含在此库中。

如何处理 Windows Phone 8 的操作事件

2014/6/18

适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

处理操作事件是用于处理触摸输入的一种方法。处理这些事件时,您可以移动并缩放对象以响应触控和多点触控输入。

有关处理触摸输入的其他方法的信息,请参见快速入门:Windows Phone 8 的触控输入

本主题包括以下部分。

在对象上受支持的操作事件源自 UIElement

支持以下操作事件:

支持以下笔势事件:

Windows Phone 平台上不支持以下项目:

  • 不支持 IsManipulationEnabled 属性。默认情况下操作事件在 Windows Phone 上已启用。

  • 不支持旋转变换。

  • 也不支持惯性事件。

此示例将创建一个包含 Canvas 上的蓝色矩形的简单应用。应用将订阅多个操作事件。事件处理程序将在您操作时移动 Rectangle 或调整其大小。事件处理程序还会在您移动或调整大小时更改矩形的颜色。

ManipulationDelta 事件会在触控输入改变位置时发生。该事件会在操作期间多次发生。例如,如果您在屏幕上拖动手指,则在手指移动时,会多次发生 ManipulationDelta 事件。此事件还会在用户抬起手指后发生。

通过处理操作事件来处理触控输入的步骤

  1. 使用 Visual C# 或 Visual Basic 创建一个新的 Windows Phone 项目。

  2. 在 MainPage.xaml 中,在名为 ContentPanelGrid 内添加以下 XAML。

    <Canvas>
        <Rectangle 
            x:Name="rectangle"
            Width="200" Height="200"
            Fill="Blue" Stroke="Blue" StrokeThickness="1" />
    </Canvas>
    
  3. 在 MainPage.xaml.cs 的 MainPage 类中,导入以下命名空间。

    using System.Windows.Media;
    using System.Windows.Input;
    
  4. MainPage 类中声明以下变量。

            private TranslateTransform move = new TranslateTransform();
            private ScaleTransform resize = new ScaleTransform();
            private TransformGroup rectangleTransforms = new TransformGroup();
    
            private Brush stationaryBrush;
            private Brush transformingBrush = new SolidColorBrush(Colors.Orange);
    
    
  5. MainPage 类中,为 ManipulationStarted 事件添加以下事件处理程序。当操作开始时,此事件处理程序会改变 Rectangle 的颜色。

            void Rectangle_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
            {
                // Save the original color before changing the color.
                stationaryBrush = rectangle.Fill;
                rectangle.Fill = transformingBrush;
            }
    
    
    
  6. MainPage 类中,为 ManipulationDelta 事件添加以下事件处理程序。此事件处理程序会将 DeltaManipulation 应用到 RectangleRenderTransform,以便在您操作时移动或调整大小。

            void Rectangle_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
            {
                // Move the rectangle.
                move.X += e.DeltaManipulation.Translation.X;
                move.Y += e.DeltaManipulation.Translation.Y;
    
                // Resize the rectangle.
                if (e.DeltaManipulation.Scale.X > 0 && e.DeltaManipulation.Scale.Y > 0)
                {
                    // Scale the rectangle.
                    resize.ScaleX *= e.DeltaManipulation.Scale.X;
                    resize.ScaleY *= e.DeltaManipulation.Scale.Y;
                }
            }
    
    
  7. MainPage 类中,为 ManipulationCompleted 事件添加以下事件处理程序。当操作结束时,此事件处理程序会恢复 Rectangle 的原始颜色。

            void Rectangle_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
            {
                // Restore the original color.
                rectangle.Fill = stationaryBrush;
            }
    
    
    
  8. MainPage 类构造函数中,将两项转换组合为一个 TransformGroup,并注册事件处理程序。

            // Constructor
            public MainPage()
            {
                InitializeComponent();
    
                // Combine the moving and resizing tranforms into one TransformGroup.
                // The rectangle's RenderTransform can only contain a single transform or TransformGroup.
                rectangleTransforms.Children.Add(move);
                rectangleTransforms.Children.Add(resize);
                rectangle.RenderTransform = rectangleTransforms;
    
                // Handle manipulation events.
                rectangle.ManipulationStarted +=
                    new EventHandler<ManipulationStartedEventArgs>(Rectangle_ManipulationStarted);
                rectangle.ManipulationDelta +=
                    new EventHandler<ManipulationDeltaEventArgs>(Rectangle_ManipulationDelta);
                rectangle.ManipulationCompleted +=
                    new EventHandler<ManipulationCompletedEventArgs>(Rectangle_ManipulationCompleted);
            }
    
    
  9. 生成并运行该项目。您会看到应用窗口中显示一个蓝色的正方形。

  10. 尝试以下操作以测试应用。请注意,您可以同时执行以下多项操作。

    • 若要移动 Rectangle,请将手指放在 Rectangle 上并在屏幕上移动手指。

    • 若要调整 Rectangle 的大小,请将两个手指放在 Rectangle 上,并将两个手指靠拢或将其分开。

      说明注意:

      Windows Phone 模拟器不支持通过鼠标执行的多点触控输入。要通过使用缩放变换来调整矩形大小,您必须在实际设备上测试应用,或者使用支持多点触控输入的开发计算机。

在 Windows Phone 8 中,ManipulationCompleted 事件标记为已为 PanoramaPivotLongListSelector 控件处理,以使 UI 响应更迅速。

如果您尝试通过在 Windows Phone 8 中使用以下代码来为其中一个指定的控件处理 ManipulationCompleted 事件,该代码决不会运行。在 Windows Phone OS 7.1 中,此代码可以运行。

myPivot.ManipulationCompleted += (s, e) =>
{
    ...
}

如果您需要在 Windows Phone 8 和 Windows Phone OS 7.1 中处理 ManipulationCompleted 事件,请使用 AddHandler 方法。例如:

this.myPivot.AddHandler(Pivot.ManipulationCompletedEvent,
    new EventHandler<ManipulationCompletedEventArgs>
    (MyPivot_ManipulationCompleted), true);

显示: