public void AnimateTo(ulong visibleTimeStart, ulong visibleTimeEnd)
            {
                if (visibleTimeStart < this.axis.AbsoluteTimeStart)
                {
                    visibleTimeStart = this.axis.AbsoluteTimeStart;
                }

                if (visibleTimeEnd > this.axis.AbsoluteTimeEnd)
                {
                    visibleTimeEnd = this.axis.AbsoluteTimeEnd;
                }

                if( visibleTimeStart > this.axis.AbsoluteTimeEnd )
                {
                    visibleTimeStart = this.axis.AbsoluteTimeStart;
                }

                if (!axis.IsAnimationEnabled)
                {
                    Stop();
                    this.axis.VisibleTimeStart = visibleTimeStart;
                    this.axis.VisibleTimeEnd = visibleTimeEnd;
                    return;
                }

                double acceleration = 0.3;

                if (this.observedAnimation != null)
                {
                    this.observedAnimation.Completed -= OnRunningAnimationCompleted;
                    acceleration = 0d;
                }

                var startAnim = new UInt64Animation { To = visibleTimeStart, AccelerationRatio = acceleration, DecelerationRatio = 0.4, Duration = TimeSpan.FromMilliseconds(1400) };
                var endAnim = new UInt64Animation { To = visibleTimeEnd, AccelerationRatio = acceleration, DecelerationRatio = 0.4, Duration = TimeSpan.FromMilliseconds(1400) };

                this.runningAnimation = startAnim;
                this.observedAnimation = startAnim;
                this.observedAnimation.Completed += OnRunningAnimationCompleted;
                this.visibleStartDest = visibleTimeStart;
                this.visibleEndDest = visibleTimeEnd;
                this.axis.BeginAnimation(TimeAxis.VisibleTimeStartProperty, startAnim);
                this.axis.BeginAnimation(TimeAxis.VisibleTimeEndProperty, endAnim);
            }
 public void Stop()
 {
     if (this.observedAnimation != null)
     {
         this.observedAnimation.Completed -= OnRunningAnimationCompleted;
         this.observedAnimation = null;
         this.runningAnimation = null;
         this.axis.BeginAnimation(TimeAxis.VisibleTimeStartProperty, null);
         this.axis.BeginAnimation(TimeAxis.VisibleTimeEndProperty, null);
         this.axis.VisibleTimeStart = this.visibleStartDest;
         this.axis.VisibleTimeEnd = this.visibleEndDest;
     }
 }