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