WPF 4 內建高階觸控事件,支援平移、縮放、旋轉等手勢。只需將 UIElement.IsManipulationEnabled = true,並處理下列事件:
ManipulationStarting:初始化容器與模式。ManipulationStarted:手勢開始。ManipulationDelta:手勢進行中(核心計算)。ManipulationInertiaStarting:慣性啟動設定。ManipulationCompleted:手勢結束。事件流程圖:

<Canvas x:Name="touchPad" Background="Gray"
ManipulationStarting="image_ManipulationStarting"
ManipulationDelta="image_ManipulationDelta"
ManipulationCompleted="image_ManipulationCompleted">
<Image Canvas.Top="52" Canvas.Left="34" Width="200"
IsManipulationEnabled="True" Source="Images/P1.jpg">
<Image.RenderTransform><MatrixTransform/></Image.RenderTransform>
</Image>
<Image Canvas.Top="75" Canvas.Left="339" Width="200"
IsManipulationEnabled="True" Source="Images/P2.jpg">
<Image.RenderTransform><MatrixTransform/></Image.RenderTransform>
</Image>
<Image Canvas.Top="243" Canvas.Left="168" Width="200"
IsManipulationEnabled="True" Source="Images/P3.jpg">
<Image.RenderTransform><MatrixTransform/></Image.RenderTransform>
</Image>
</Canvas>
執行畫面:

private void image_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
e.ManipulationContainer = touchPad; // 參考座標系
e.Mode = ManipulationModes.All; // 允許平移/縮放/旋轉
}
private void image_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
var element = (FrameworkElement)e.Source;
element.Opacity = 0.5; // 操作中半透明
Matrix matrix = ((MatrixTransform)element.RenderTransform).Matrix;
var delta = e.DeltaManipulation;
// 以元素中心為基準點
Point center = new Point(element.ActualWidth / 2, element.ActualHeight / 2);
center = matrix.Transform(center);
matrix.ScaleAt(delta.Scale.X, delta.Scale.Y, center.X, center.Y);
matrix.RotateAt(delta.Rotation, center.X, center.Y);
matrix.Translate(delta.Translation.X, delta.Translation.Y);
((MatrixTransform)element.RenderTransform).Matrix = matrix;
}
private void image_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
((FrameworkElement)e.Source).Opacity = 1;
}