&tag(WPF/プログレスバー);
<Window x:Class="ControlDemo.DialogDemo.ProgressDialogBasic.ProgressDialogBasicWindow"
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"
xmlns:local="clr-namespace:ControlDemo.DialogDemo.ProgressDialogBasic"
mc:Ignorable="d"
Title="プログレスバー付きのダイアログ" Height="140" Width="400">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<ProgressBar x:Name="progressBar" Height="25" Margin="10" Minimum="0" Maximum="100" Value="50"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="10">
<Button x:Name="buttonStart" Width="100" Click="ButtonStart_Click">開始</Button>
<Button x:Name="buttonChange" Width="100" Click="ButtonChange_Click">変更</Button>
<Button x:Name="buttonFinish" Width="100" Margin="10,0,0,0" Click="ButtonFinish_Click" IsEnabled="False">終了</Button>
</StackPanel>
</Grid>
</Window>
namespace ControlDemo.DialogDemo.ProgressDialogBasic
{
public partial class ProgressDialogBasicWindow : Window
{
private BackgroundWorker backgroundWorker = new BackgroundWorker();
private ProgressDialogBasicVM viewModel;
public ProgressDialogBasicWindow()
{
InitializeComponent();
this.viewModel = new ProgressDialogBasicVM();
DataContext = viewModel;
//BackgroundWorkerのセットアップ
//進捗状況を報告したい場合trueに設定
backgroundWorker.WorkerReportsProgress = true;
//途中でキャンセルしたい場合trueに設定
backgroundWorker.WorkerSupportsCancellation = true;
//プログレス値が変更した場合の処理
backgroundWorker.ProgressChanged += ProgressChanged;
//BackgroundWorkerで実行する処理
backgroundWorker.DoWork += DoWork;
//終了時に呼び出される
backgroundWorker.RunWorkerCompleted += RunWorkerCompleted;
}
private void DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 50; i <= 100; i++)
{
if (backgroundWorker.CancellationPending)
{
//キャンセルしたい場合作業中に明示的にチェックを行う必要がある
e.Cancel = true;
return;
}
Thread.Sleep(200);
backgroundWorker.ReportProgress(i);
}
}
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Cancel");
} else
{
MessageBox.Show("Completed");
}
buttonStart.IsEnabled = true;
buttonFinish.IsEnabled = false;
}
private void ButtonStart_Click(object sender, RoutedEventArgs e)
{
buttonStart.IsEnabled = false;
buttonFinish.IsEnabled = true;
backgroundWorker.RunWorkerAsync();
}
private void ButtonFinish_Click(object sender, RoutedEventArgs e)
{
backgroundWorker.CancelAsync();
buttonStart.IsEnabled = true;
buttonFinish.IsEnabled = false;
}
}
}
private void ButtonChange_Click(object buttonSender, RoutedEventArgs routedEvent)
{
DoWorkEventHandler handler = (sender, e) =>
{
for (int i = 50; i <= 100; i++)
{
BackgroundWorker worker = sender as BackgroundWorker;
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
Thread.Sleep(2);
worker.ReportProgress(i);
}
};
ChangeDoWork(handler);
}
private void ChangeDoWork(DoWorkEventHandler handler)
{
backgroundWorker.DoWork -= DoWork;
backgroundWorker.DoWork += handler;
}