public Form1() { InitializeSurfaceInput(); Affine2DManipulations supportedManipulations = Affine2DManipulations.TranslateX | Affine2DManipulations.TranslateY | Affine2DManipulations.Scale; manipulationProcessor = new Affine2DManipulationProcessor(supportedManipulations); manipulationProcessor.Affine2DManipulationStarted += OnAffine2DManipulationStarted; manipulationProcessor.Affine2DManipulationDelta += OnAffine2DDelta; manipulationProcessor.Affine2DManipulationCompleted += OnAffine2DManipulationCompleted; inertiaProcessor = new Affine2DInertiaProcessor(); inertiaProcessor.Affine2DInertiaCompleted += OnAffine2DInertiaCompleted; inertiaProcessor.Affine2DInertiaDelta += OnAffine2DDelta; Visible = true; InteractiveSurface interactiveSurface = InteractiveSurface.DefaultInteractiveSurface; if (interactiveSurface != null) { FormBorderStyle = FormBorderStyle.None; } UpdateWindowPosition(); // Set the application's orientation based on the current launcher orientation //currentOrientation = ApplicationLauncher.Orientation; // Subscribe to surface application activation events ApplicationLauncher.ApplicationActivated += OnApplicationActivated; ApplicationLauncher.ApplicationPreviewed += OnApplicationPreviewed; ApplicationLauncher.ApplicationDeactivated += OnApplicationDeactivated; }
public SurfaceVEMap() : base() { lastExpansionDelta = 0; downContacts = new List <Contact>(); this.manipulationProcessor = new Affine2DManipulationProcessor( Affine2DManipulations.TranslateX | Affine2DManipulations.TranslateY | Affine2DManipulations.Scale | Affine2DManipulations.Rotate, this, false); this.manipulationProcessor.Affine2DManipulationCompleted += new EventHandler <Affine2DOperationCompletedEventArgs>(manipulationProcessor_Affine2DManipulationCompleted); this.manipulationProcessor.Affine2DManipulationDelta += new EventHandler <Affine2DOperationDeltaEventArgs>(manipulationProcessor_Affine2DManipulationDelta); this.manipulationProcessor.Affine2DManipulationStarted += new EventHandler <Affine2DOperationStartedEventArgs>(manipulationProcessor_Affine2DManipulationStarted); this.inertiaProcessor = new Affine2DInertiaProcessor(); this.inertiaProcessor.Affine2DInertiaDelta += new EventHandler <Affine2DOperationDeltaEventArgs>(inertiaProcessor_Affine2DInertiaDelta); this.inertiaProcessor.Affine2DInertiaCompleted += new EventHandler <Affine2DOperationCompletedEventArgs>(inertiaProcessor_Affine2DInertiaCompleted); }
/// <summary> /// Start the flicking behavior. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnAffine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e) { if (inertiaProcessor != null) { inertiaProcessor.Affine2DInertiaDelta -= OnAffine2DInertiaDelta; inertiaProcessor.Affine2DInertiaCompleted -= OnAffine2DInertiaCompleted; inertiaProcessor = null; } // The Manipulations should all run in screen space so don't convert between spaces. VectorF initialVelocity; VectorF maxViewPortSize; if (Orientation == Orientation.Horizontal) { initialVelocity = new VectorF(e.VelocityX, 0); maxViewPortSize = new VectorF(numberOfPixelsInAxis * viewportSize, 0); } else { initialVelocity = new VectorF(0, e.VelocityY); maxViewPortSize = new VectorF(0, numberOfPixelsInAxis * viewportSize); } // Check velocity. if (initialVelocity.Length < FlickUtilities.MinimumFlickVelocity) { return; } if (initialVelocity.Length >= MaximumFlickVelocity) { // If velocity is too large, reduce it to a reasonable value. initialVelocity.Normalize(); initialVelocity = MaximumFlickVelocity * initialVelocity; } VectorF flickDistance; if (FlickUtilities.TryGetFlickDistance(initialVelocity, out flickDistance, maxViewPortSize)) { processInertia = true; inertiaProcessor = new Affine2DInertiaProcessor(); inertiaProcessor.Affine2DInertiaDelta += OnAffine2DInertiaDelta; inertiaProcessor.Affine2DInertiaCompleted += OnAffine2DInertiaCompleted; float displacement = 0; if (flickDistance.X == 0) { displacement = flickDistance.Y; } else if (flickDistance.Y == 0) { displacement = flickDistance.X; } else { displacement = Math.Min(flickDistance.X, flickDistance.Y); } inertiaProcessor.DesiredDisplacement = float.IsInfinity(displacement) ? 0 : Math.Abs(displacement); inertiaProcessor.InitialTimestamp = stopwatch.ElapsedTicks; inertiaProcessor.InitialVelocityX = initialVelocity.X; inertiaProcessor.InitialVelocityY = initialVelocity.Y; inertiaProcessor.InitialOriginX = ToScreenSpace(Value); inertiaProcessor.InitialOriginY = ToScreenSpace(Value); } }
/// <summary> /// Set the flick to completed so that it stops moving. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void OnAffine2DInertiaCompleted(object sender, Affine2DOperationCompletedEventArgs e) { processInertia = false; manipulationProcessor = null; if (inertiaProcessor != null) { inertiaProcessor.Affine2DInertiaDelta -= new EventHandler<Affine2DOperationDeltaEventArgs>(OnAffine2DInertiaDelta); inertiaProcessor.Affine2DInertiaCompleted -= new EventHandler<Affine2DOperationCompletedEventArgs>(OnAffine2DInertiaCompleted); inertiaProcessor = null; } }
public override void OnApplyTemplate() { // Set up the ContentPresenter. _content = GetTemplateChild("PART_Content") as ContentPresenter; _translate = new TranslateTransform(); _scale = new ScaleTransform(); _content.RenderTransform = new TransformGroup { Children = new TransformCollection { _scale, _translate } }; _content.RenderTransformOrigin = new Point(.5, .5); // Set up the spring animation. _spring = new Storyboard { Duration = TimeSpan.FromMilliseconds(200), FillBehavior = FillBehavior.Stop, DecelerationRatio = .6 }; _spring.Completed += Spring_Completed; _springScaleX = new DoubleAnimation { Duration = _spring.Duration, To = 1, DecelerationRatio = _spring.DecelerationRatio }; Storyboard.SetTarget(_springScaleX, _content); Storyboard.SetTargetProperty(_springScaleX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)")); _spring.Children.Add(_springScaleX); _springScaleY = new DoubleAnimation { Duration = _spring.Duration, To = 1, DecelerationRatio = _spring.DecelerationRatio }; Storyboard.SetTarget(_springScaleY, _content); Storyboard.SetTargetProperty(_springScaleY, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)")); _spring.Children.Add(_springScaleY); _springTranslateX = new DoubleAnimation { Duration = _spring.Duration, To = 0, DecelerationRatio = _spring.DecelerationRatio }; Storyboard.SetTarget(_springTranslateX, _content); Storyboard.SetTargetProperty(_springTranslateX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.X)")); _spring.Children.Add(_springTranslateX); _springTranslateY = new DoubleAnimation { Duration = _spring.Duration, To = 0, DecelerationRatio = _spring.DecelerationRatio }; Storyboard.SetTarget(_springTranslateY, _content); Storyboard.SetTargetProperty(_springTranslateY, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)")); _spring.Children.Add(_springTranslateY); _spring.Begin(this, true); ClipToBounds = true; // Set up the ManipulationProcessor. _contentManipulationProcessor = new Affine2DManipulationProcessor(Affine2DManipulations.Scale | Affine2DManipulations.TranslateX | Affine2DManipulations.TranslateY, this); _contentManipulationProcessor.Affine2DManipulationStarted += ContentManipulationProcessor_Affine2DManipulationStarted; _contentManipulationProcessor.Affine2DManipulationDelta += ContentManipulationProcessor_Affine2DManipulationDelta; _contentManipulationProcessor.Affine2DManipulationCompleted += ContentManipulationProcessor_Affine2DManipulationCompleted; // Set up the InertiaProcessor. _inertiaProcessor = new Affine2DInertiaProcessor(); _inertiaProcessor.Affine2DInertiaDelta += ContentManipulationProcessor_Affine2DManipulationDelta; _inertiaProcessor.DesiredDeceleration = 96 * 1.5 * .001 * .001; _inertiaProcessor.ElasticMargin = new Thickness(25); base.OnApplyTemplate(); }
/// <summary> /// Start the inertia processor in Surface screen space. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnAffine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e) { if (inertiaProcessor != null) { inertiaProcessor.Affine2DInertiaDelta -= OnAffine2DInertiaDelta; inertiaProcessor.Affine2DInertiaCompleted -= OnAffine2DInertiaCompleted; inertiaProcessor.Complete(); } VectorF translation = new VectorF(e.TotalTranslationX, e.TotalTranslationY); // Don't start inertia if the tranlation is less than roughly 1/8" regardless of velocity. if (translation.Length < 96 / 8f) { return; } // Scroll in the opposite direction because a ScrollViewer moves with the contact. VectorF initialVelocity = new VectorF(-e.VelocityX, -e.VelocityY); // Check velocity. if (initialVelocity.Length < FlickUtilities.MinimumFlickVelocity) { // If velocity is below this threshold ignore it. return; } if (initialVelocity.Length >= FlickUtilities.MaximumFlickVelocity) { // If velocity is too large, reduce it to a reasonable value. initialVelocity.Normalize(); initialVelocity = FlickUtilities.MaximumFlickVelocity * initialVelocity; } processInertia = true; inertiaProcessor = new Affine2DInertiaProcessor(); inertiaProcessor.Affine2DInertiaDelta += OnAffine2DInertiaDelta; inertiaProcessor.Affine2DInertiaCompleted += OnAffine2DInertiaCompleted; inertiaProcessor.DesiredDisplacement = ConvertFromVerticalValueToScreenSpace(VerticalViewportSize); inertiaProcessor.InitialVelocityX = initialVelocity.X * HorizontalViewportSize; inertiaProcessor.InitialVelocityY = initialVelocity.Y * VerticalViewportSize; inertiaProcessor.InitialTimestamp = stopwatch.ElapsedTicks; inertiaProcessor.InitialOriginX = ConvertFromHorizontalValueToScreenSpace(horizontalScrollBarStateMachine.Value); inertiaProcessor.InitialOriginY = ConvertFromVerticalValueToScreenSpace(verticalScrollBarStateMachine.Value); }