Windows 8 觸控體驗建立在三大支柱:邊緣手勢 (系統選單喚起)、Manipulation (直接操作:平移/縮放/旋轉)、GestureRecognizer (語義識別:CrossSlide、Tap、Hold)。本文完整實作三者核心 API 與事件流程。
從螢幕邊緣向內滑動喚起 App Bar/Charms Bar。
var edgeGesture = EdgeGesture.GetForCurrentView();
edgeGesture.Starting += (s,e) => Log("EdgeGesture Starting");
edgeGesture.Completed += (s,e) => Log("EdgeGesture Completed");
edgeGesture.Canceled += (s,e) => Log("EdgeGesture Canceled");
// EdgeGestureEventArgs.Kind: Touch / Keyboard (Win+Z) / Mouse (右鍵)
<Rectangle x:Name="rectangle" Width="200" Height="200" Fill="Orange"
ManipulationMode="All" />
// 變換群組:先套用累積矩陣,再套用當前增量
_transformGroup = new TransformGroup();
_previousTransform = new MatrixTransform { Matrix = Matrix.Identity };
_compositeTransform = new CompositeTransform();
_transformGroup.Children.Add(_previousTransform);
_transformGroup.Children.Add(_compositeTransform);
rectangle.RenderTransform = _transformGroup;
void rectangle_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
_previousTransform.Matrix = _transformGroup.Value; // 累積
var center = _previousTransform.TransformPoint(new Point(e.Position.X, e.Position.Y));
_compositeTransform.CenterX = center.X;
_compositeTransform.CenterY = center.Y;
_compositeTransform.Rotation = e.Delta.Rotation;
_compositeTransform.ScaleX = e.Delta.Scale;
_compositeTransform.ScaleY = e.Delta.Scale;
_compositeTransform.TranslateX = e.Delta.Translation.X;
_compositeTransform.TranslateY = e.Delta.Translation.Y;
}
// 慣性設定範例 (ManipulationInertiaStarting)
e.TranslationBehavior.DesiredDeceleration = 0.001; // 位移減速
e.ExpansionBehavior.DesiredDeceleration = 0.0001; // 縮放減速
e.RotationBehavior.DesiredDeceleration = 0.001; // 旋轉減速
關鍵結構體**:
ManipulationDelta:Translation (Point), Scale (double), Rotation (double), Expansion (double)。ManipulationVelocities:Linear (Point/ms), Angular (deg/ms), Expansion (dip/ms)。| API | 定位 | 典型用途 |
|---|---|---|
| Manipulation | 直接操作 | 拖曳排序、縮放圖片、旋轉物件 |
| GestureRecognizer | 語義識別 | CrossSlide 選取、Tap 點擊、Hold 長按、RightTap 右鍵選單 |
_gestureRecognizer = new GestureRecognizer();
_gestureRecognizer.GestureSettings = GestureSettings.CrossSlide; // 只啟用 CrossSlide
_gestureRecognizer.CrossSliding += (s, args) =>
Log($"CrossSliding: {args.CrossSlidingState} at {args.Position}");
// Pointer 事件必須轉發給 GestureRecognizer
void Page_PointerPressed(object sender, PointerRoutedEventArgs e)
=> _gestureRecognizer.ProcessDownEvent(e.GetCurrentPoint(null));
void Page_PointerMoved(object sender, PointerRoutedEventArgs e)
=> _gestureRecognizer.ProcessMoveEvents(e.GetIntermediatePoints(null));
void Page_PointerReleased(object sender, PointerRoutedEventArgs e)
=> _gestureRecognizer.ProcessUpEvent(e.GetCurrentPoint(null));
// 切換方向
_gestureRecognizer.CrossSlideHorizontally = true; // 水平
_gestureRecognizer.CrossSlideHorizontally = false; // 垂直
Tap, DoubleTap, Hold, HoldWithMouse, RightTap,
Drag, CrossSlide,
ManipulationTranslateX, ManipulationTranslateY,
ManipulationTranslateRailsX, ManipulationTranslateRailsY,
ManipulationRotate, ManipulationScale,
ManipulationTranslateInertia, ManipulationRotateInertia, ManipulationScaleInertia
ManipulationMode 與轉發 Pointer 給 GestureRecognizer,分別處理直接操作與語義識別。