Mega Code Archive

 
Categories / Silverlight / UI Controls
 

A Cancellable ProgressBar While Processing on a Background Thread

<UserControl x:Class='SilverlightApplication3.MainPage'     xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'      xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'     xmlns:d='http://schemas.microsoft.com/expression/blend/2008'      xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'      mc:Ignorable='d'      d:DesignWidth='640'      d:DesignHeight='480'>     <StackPanel>         <ProgressBar Name="progressBar"/>         <Button Name="button" Click="button_Click">             Start         </Button>     </StackPanel> </UserControl> //File:Window.xaml.cs using System.ComponentModel; using System.Threading; using System.Windows; using System.Windows.Input; using System; using System.Windows.Controls; namespace SilverlightApplication3 {         public partial class MainPage : UserControl     {         private BackgroundWorker worker = new BackgroundWorker();         public MainPage()         {             InitializeComponent();             worker.WorkerReportsProgress = true;             worker.WorkerSupportsCancellation = true;             worker.DoWork += new DoWorkEventHandler(worker_DoWork);             worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);             worker.ProgressChanged += worker_ProgressChanged;         }         private void button_Click(object sender, RoutedEventArgs e){             if(!worker.IsBusy)             {                 this.Cursor = Cursors.Wait;                 worker.RunWorkerAsync();                 button.Content = "Cancel";             }else{                 worker.CancelAsync();             }         }         private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)         {             this.Cursor = Cursors.Arrow;             if(e.Cancelled)             {                 Console.WriteLine("Operation was canceled");             }             else if(e.Error != null)             {                 Console.WriteLine(e.Error.Message);             }             button.Content = "Start";         }         private void worker_DoWork(object sender, DoWorkEventArgs e)         {             for(int i = 1; i <= 100; i++)             {                 if(worker.CancellationPending)                 {                     e.Cancel = true;                     return;                 }                 Thread.Sleep(100);                 worker.ReportProgress(i);             }         }         private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)         {             progressBar.Value = e.ProgressPercentage;         }     } }