Mega Code Archive

 
Categories / C# / WPF
 

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);             }         }     } }