public void DoubleAnimationKeyFrameRepeatTest() { DoubleAnimationUsingKeyFrames animation; animation = new DoubleAnimationUsingKeyFrames(); animation.KeyFrames.Add(new LinearDoubleKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)), Value = 0 }); animation.KeyFrames.Add(new LinearDoubleKeyFrame { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)), Value = 1 }); animation.Duration = new Duration(TimeSpan.FromSeconds(2)); animation.RepeatBehavior = RepeatBehavior.Forever; TestRootClock rootClock = new TestRootClock(); AnimationTimelineClock clock = (AnimationTimelineClock)animation.CreateClock(); clock.Begin(rootClock); rootClock.Tick(TimeSpan.FromSeconds(0.1)); Assert.AreEqual(0.1, (double)animation.GetCurrentValue(0.0, 0.0, clock)); rootClock.Tick(TimeSpan.FromSeconds(0.9)); Assert.AreEqual(0.9, (double)animation.GetCurrentValue(0.0, 0.0, clock)); rootClock.Tick(TimeSpan.FromSeconds(1)); Assert.AreEqual(1, (double)animation.GetCurrentValue(0.0, 0.0, clock)); rootClock.Tick(TimeSpan.FromSeconds(1.9)); Assert.AreEqual(1, (double)animation.GetCurrentValue(0.0, 0.0, clock)); rootClock.Tick(TimeSpan.FromSeconds(2.1)); Assert.AreEqual(0.1, (double)animation.GetCurrentValue(0.0, 0.0, clock)); rootClock.Tick(TimeSpan.FromSeconds(2.9)); Assert.AreEqual(0.9, (double)animation.GetCurrentValue(0.0, 0.0, clock)); }
private void MoveResourceInBounds(ResourceViewModel resourceViewModel) { Storyboard storyboard = new Storyboard(); var view = (FrameworkElement)(desktopView.ItemContainerGenerator.ContainerFromItem(resourceViewModel)); const double offset = 4; double left = resourceViewModel.Left; double right = left + view.ActualWidth; double top = resourceViewModel.Top; double bottom = top + view.ActualHeight; bool leftOutBound = left < 0; bool rightOutBound = right > desktopView.ActualWidth; bool topOutBound = top < 0; bool bottomOutBound = bottom > desktopView.ActualHeight; if (leftOutBound || rightOutBound) { double from = left; double to = (leftOutBound ? offset : (desktopView.ActualWidth - view.ActualWidth - offset)); DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames() { Duration = TimeSpan.FromMilliseconds(125) }; animation.KeyFrames.Add(new SplineDoubleKeyFrame(from, KeyTime.FromTimeSpan(TimeSpan.Zero))); animation.KeyFrames.Add(new SplineDoubleKeyFrame(to + ((leftOutBound ? offset : offset * -1) * 2), KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(80)))); animation.KeyFrames.Add(new SplineDoubleKeyFrame(to, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(125)))); AnimationClock clock = animation.CreateClock(); clock.CurrentTimeInvalidated += (sender, e) => { double current = animation.GetCurrentValue(from, to, clock); resourceViewModel.Left = current; }; storyboard.Children.Add(animation); Storyboard.SetTargetProperty(animation, new PropertyPath(ResourceView.DummyLeftProperty)); } if (topOutBound || bottomOutBound) { double from = top; double to = (topOutBound ? offset : (desktopView.ActualHeight - view.ActualHeight - offset)); DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames() { Duration = TimeSpan.FromMilliseconds(125) }; animation.KeyFrames.Add(new SplineDoubleKeyFrame(from, KeyTime.FromTimeSpan(TimeSpan.Zero))); animation.KeyFrames.Add(new SplineDoubleKeyFrame(to + ((topOutBound ? offset : offset * -1) * 2), KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(80)))); animation.KeyFrames.Add(new SplineDoubleKeyFrame(to, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(125)))); AnimationClock clock = animation.CreateClock(); clock.CurrentTimeInvalidated += (sender, e) => { double current = animation.GetCurrentValue(from, to, clock); resourceViewModel.Top = current; }; storyboard.Children.Add(animation); Storyboard.SetTargetProperty(animation, new PropertyPath(ResourceView.DummyTopProperty)); } this.BeginStoryboard(storyboard); }