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);
            }
        }