Control the Progress of an Animation

image_pdfimage_print


   
  

<Window x:Class="WpfApplication1.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="" Height="300" Width="600">
    <Grid>
        <Rectangle x:Name="Rectangle" Height="100" Width="100" Fill="Firebrick">
            <Rectangle.RenderTransform>
                <MatrixTransform x:Name="RectangleMatrixTransform" />
            </Rectangle.RenderTransform>

            <Rectangle.Triggers>
                <EventTrigger RoutedEvent="Rectangle.Loaded">
                    <BeginStoryboard x:Name="RectangleStoryboard">
                        <Storyboard x:Name="Storyboard" CurrentTimeInvalidated="Storyboard_Changed">
                            <MatrixAnimationUsingPath Storyboard.TargetName="RectangleMatrixTransform" Storyboard.TargetProperty="Matrix" Duration="0:0:10"
                RepeatBehavior="Forever">
                                <MatrixAnimationUsingPath.PathGeometry>
                                    <PathGeometry Figures="M -100,0 300, 0" />
                                </MatrixAnimationUsingPath.PathGeometry>
                            </MatrixAnimationUsingPath>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Rectangle.Triggers>
        </Rectangle>

        <Slider x:Name="Seeker" Minimum="0" Maximum="1" SmallChange="0.001" ValueChanged="Seeker_ValueChanged">
            <Slider.Triggers>
                <EventTrigger RoutedEvent="Slider.MouseLeftButtonDown">
                    <StopStoryboard BeginStoryboardName="RectangleStoryboard" />
                </EventTrigger>
                <EventTrigger RoutedEvent="Slider.MouseLeftButtonUp">
                    <ResumeStoryboard BeginStoryboardName="RectangleStoryboard" />
                </EventTrigger>
            </Slider.Triggers>
        </Slider>
    </Grid>
</Window>

//File:Window.xaml.cs
using System;
using System.Windows;
using System.Windows.Media.Animation;
using System.Windows.Input;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private void Storyboard_Changed(object sender, System.EventArgs e)
        {
            ClockGroup clockGroup = sender as ClockGroup;
            AnimationClock animationClock = clockGroup.Children[0] as AnimationClock;
            if (animationClock.CurrentProgress.HasValue)
            {
                Seeker.Value = animationClock.CurrentProgress.Value;
            }
        }
        private void Seeker_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            Storyboard.Seek(Rectangle,
                            TimeSpan.FromTicks((long)(Storyboard.Children[0].Duration.TimeSpan.Ticks * Seeker.Value)),
                            TimeSeekOrigin.BeginTime);
        }
    }
}