protected override void OnManipulationDelta(System.Windows.Input.ManipulationDeltaEventArgs e) { Rectangle rectToMove = e.OriginalSource as Rectangle; Matrix rectsMatrix = ((MatrixTransform)rectToMove.RenderTransform).Matrix; rectsMatrix.RotateAt(e.DeltaManipulation.Rotation, e.ManipulationOrigin.X, e.ManipulationOrigin.Y); rectsMatrix.ScaleAt(e.DeltaManipulation.Scale.X, e.DeltaManipulation.Scale.X, e.ManipulationOrigin.X, e.ManipulationOrigin.Y); rectsMatrix.Translate(e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y); rectToMove.RenderTransform = new MatrixTransform(rectsMatrix); Rect containingRect = new Rect(((FrameworkElement)e.ManipulationContainer).RenderSize); Rect shapeBounds = rectToMove.RenderTransform.TransformBounds( new Rect(rectToMove.RenderSize)); if (e.IsInertial && !containingRect.Contains(shapeBounds)) { e.Complete(); } e.Handled = true; //base.OnManipulationDelta(e); }
void winControl_ManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e) { // Left to Right: +X // Right to Left: -X // Top to Bottom: +Y // Bottom to Top: -Y // get the movement both directionally and absolute val var delX = e.CumulativeManipulation.Translation.X; var absX = Math.Abs(delX); var delY = e.CumulativeManipulation.Translation.Y; var absY = Math.Abs(delY); // calculate how much change will trigger an action based on the control's size var upDownMinDelta = this.ActualHeight * deltaPercentage; var leftRightMinDelta = this.ActualWidth * deltaPercentage; //System.Diagnostics.Debug.WriteLine("X: {0}, Y: {1}", delX, delY); if (absX > absY && absX > leftRightMinDelta) { if (delX < 0) { this.Element.OnSwipeLeft(); } else { this.Element.OnSwipeRight(); } e.Complete(); } else if (absY > absX && absY > upDownMinDelta) { if (delY < 0) { this.Element.OnSwipeUp(); } else { this.Element.OnSwipeDown(); } e.Complete(); } }