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);
}
}
}
}
Related examples in the same category