<Window x:Class="WpfApplication1.PathAnimationExample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Path Animation" Height="500" Width="518"> <Canvas Margin="5"> <Polyline Points="0,345,96,345,320,432,500,432" Stroke="Gray" StrokeThickness="5" /> <Path> <Path.Data> <PathGeometry x:Name="path2" Figures="M0,292 L75,292 300,380,449,380" /> </Path.Data> </Path> <Ellipse Name="circle2" Stroke="DarkGoldenrod" Canvas.Left="0" Canvas.Top="293" Width="50" Height="50"> <Ellipse.Fill> <LinearGradientBrush> <GradientStop Color="DarkGoldenrod" Offset="0.5" /> <GradientStop Color="Gold" Offset="0.5" /> </LinearGradientBrush> </Ellipse.Fill> <Ellipse.RenderTransform> <RotateTransform x:Name="circle2Rotate" CenterX="25" CenterY="25" /> </Ellipse.RenderTransform> </Ellipse> </Canvas> </Window> //File:Window.xaml.cs using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace WpfApplication1 { public partial class PathAnimationExample : Window { public PathAnimationExample() { InitializeComponent(); path2.Freeze(); // For performance benefits. DoubleAnimationUsingPath daPath = new DoubleAnimationUsingPath(); daPath.Duration = TimeSpan.FromSeconds(5); daPath.RepeatBehavior = RepeatBehavior.Forever; daPath.AccelerationRatio = 0.6; daPath.DecelerationRatio = 0.4; daPath.AutoReverse = true; daPath.PathGeometry = path2; daPath.Source = PathAnimationSource.X; circle2.BeginAnimation(Canvas.LeftProperty, daPath); daPath = new DoubleAnimationUsingPath(); daPath.Duration = TimeSpan.FromSeconds(5); daPath.RepeatBehavior = RepeatBehavior.Forever; daPath.AccelerationRatio = 0.6; daPath.DecelerationRatio = 0.4; daPath.AutoReverse = true; daPath.PathGeometry = path2; daPath.Source = PathAnimationSource.Y; circle2.BeginAnimation(Canvas.TopProperty, daPath); } } }