private void StartMarkerAnimation(ToggleButton milestoneButton) { markerState = MarkerStates.Animating; markerAnimationStartTime = DateTime.Now; markerAnimationStartX = marker.Margin.Left; Rect milestoneButtonRect = GetBoundingBox(milestoneButton, uniformGrid); markerAnimationEndX = milestoneButtonRect.Left + milestoneButtonRect.Width * 0.5 + uniformGrid.Margin.Left; marker.Visibility = Visibility.Visible; }
//this gets called once per frame void CompositionTarget_Rendering(object sender, EventArgs e) { if (!initialisedMarker && milestoneButtons != null) { if (milestoneButtons.Length > 0) { Rect milestoneButtonRect = GetBoundingBox(milestoneButtons[0], uniformGrid); double x = milestoneButtonRect.Left + milestoneButtonRect.Width * 0.5 + uniformGrid.Margin.Left; marker.Margin = new Thickness(x, marker.Margin.Top, marker.Margin.Right, marker.Margin.Bottom); } initialisedMarker = true; } if (markerState == MarkerStates.Animating) { DateTime now = DateTime.Now; TimeSpan elapsed = now - markerAnimationStartTime; double t = elapsed.TotalMilliseconds / (WpfApplication1.Properties.Settings.Default.MissionTimelineMarkerAnimateSeconds * 1000.0); if (t > 1.0) { t = 1.0; markerState = MarkerStates.Stopped; } //apply easing t = 1.0f - t; t = t * t * t; t = 1.0f - t; double x = (1.0f - t) * markerAnimationStartX + t * markerAnimationEndX; marker.Margin = new Thickness(x, marker.Margin.Top, marker.Margin.Right, marker.Margin.Bottom); } }