Show a Continuous Animation During an Asynchronous Process
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF" Height="220" Width="180"> <Window.Resources> <Storyboard x:Key="PulseStoryboard" AutoReverse="True" > <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.5000000" Value="Lime"/> </ColorAnimationUsingKeyFrames> <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.5000000" Value="Green"/> </ColorAnimationUsingKeyFrames> </Storyboard> </Window.Resources> <Grid x:Name="LayoutRoot" > <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="60" /> </Grid.RowDefinitions> <Ellipse Width="100" Height="100" Margin="10" Stroke="{x:Null}" x:Name="ellipse"> <Ellipse.Fill> <RadialGradientBrush GradientOrigin="0.25,0.25"> <GradientStop Offset="0" Color="Red"/> <GradientStop Offset="1" Color="Blue"/> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> <Button Margin="10" Content="Start" Grid.Row="1" x:Name="button" Click="button_Click"/> </Grid> </Window> //File:Window.xaml.cs using System.Windows; using System.Threading; using System.ComponentModel; using System.Windows.Media.Animation; namespace WpfApplication1 { public partial class Window1 : Window { private Storyboard pulseStoryboard; private BackgroundWorker worker; public Window1() { InitializeComponent(); pulseStoryboard = (Storyboard) this.Resources["PulseStoryboard"]; pulseStoryboard.RepeatBehavior = RepeatBehavior.Forever; worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); } private void button_Click(object sender, RoutedEventArgs e) { pulseStoryboard.Begin(this, true); worker.RunWorkerAsync(); button.IsEnabled = false; } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { button.IsEnabled = true; pulseStoryboard.Stop(this); } private void worker_DoWork(object sender, DoWorkEventArgs e) { for(int i = 1; i <= 50; i++) { Thread.Sleep(100); } } } }