Control the Progress of an Animation
<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.vb Imports System Imports System.Windows Imports System.Windows.Media.Animation Imports System.Windows.Input Namespace WpfApplication1 Public Partial Class Window1 Inherits Window Public Sub New() InitializeComponent() End Sub Private Sub Storyboard_Changed(sender As Object, e As System.EventArgs) Dim clockGroup As ClockGroup = TryCast(sender, ClockGroup) Dim animationClock As AnimationClock = TryCast(clockGroup.Children(0), AnimationClock) If animationClock.CurrentProgress.HasValue Then Seeker.Value = animationClock.CurrentProgress.Value End If End Sub Private Sub Seeker_ValueChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of Double)) Storyboard.Seek(Rectangle, TimeSpan.FromTicks(CLng(Storyboard.Children(0).Duration.TimeSpan.Ticks * Seeker.Value)), TimeSeekOrigin.BeginTime) End Sub End Class End Namespace