進捗状況値の取得/設定を行うには Value プロパティを設定します。
Value プロパティに設定できる値は、最小値はMinimumプロパティの値、最大値はMaximumプロパティの値です。
下記は、[Start]ボタンがクリックされると Value 値が増加し、[Stop]ボタンがクリックされるか最大値に達するまでの間進捗を続ける例です。
この例に示したコードでは BackgroundWorker クラスを使用してバックグラウンドでProgressBarの進捗を行っています。
XAMLの例
<ProgressBar Name="ProgressBar1"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="12,12,0,0" Height="16" Width="254"
Minimum="0" Maximum="100" Value="0"/>
<Button Content="START" Height="23" HorizontalAlignment="Left" Margin="12,34,0,0"
Name="btnStart" VerticalAlignment="Top" Width="75" />
<Button Content="STOP" Height="23" HorizontalAlignment="Right" Margin="0,34,110,0"
Name="btnStop" VerticalAlignment="Top" Width="75" />
VBの例
Private WithEvents Worker As System.ComponentModel.BackgroundWorker
' [START]ボタンクリック時の処理
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnStart.Click
'[START]/[STOP]ボタンの初期化
btnStart.IsEnabled = False
btnStop.IsEnabled = True
'プログレスバーの現在値を0で初期化
ProgressBar1.Value = 0
Worker = New System.ComponentModel.BackgroundWorker
'進捗状況の報告をできるようにする
Worker.WorkerReportsProgress = True
'キャンセル処理をできるようにする
Worker.WorkerSupportsCancellation = True
'バックグラウンド処理の実行
Worker.RunWorkerAsync()
End Sub
' [STOP]ボタンクリック時の処理
Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnStop.Click
If IsNothing(Worker) Then Return
'バックグラウンド処理をキャンセルする
Worker.CancelAsync()
MessageBox.Show(String.Format("現在値は{0}です", ProgressBar1.Value))
End Sub
' 時間のかかる処理を実行
Private Sub Worker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Worker.DoWork
For Value As Integer = 0 To 100
If Worker.CancellationPending Then
Exit For
End If
Worker.ReportProgress(Value)
'500mSecスリープ
System.Threading.Thread.Sleep(100)
Next
End Sub
' 現在値の更新
Private Sub Worker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles Worker.ProgressChanged
'プログレスバーの現在値を更新する
ProgressBar1.Value = e.ProgressPercentage
End Sub
' 「時間のかかる処理」終了時の処理
Private Sub Worker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles Worker.RunWorkerCompleted
'[START]/[STOP]ボタンの初期化
btnStart.IsEnabled = True
btnStop.IsEnabled = False
End Sub
C#の例
System.ComponentModel.BackgroundWorker Worker;
// [START]ボタンクリック時の処理
private void btnStart_Click(object sender, RoutedEventArgs e)
{
// [START]/[STOP]ボタンの初期化
btnStart.IsEnabled = false;
btnStop.IsEnabled = true;
// プログレスバーの現在値を0で初期化
progressBar1.Value = 0;
Worker = new System.ComponentModel.BackgroundWorker();
// イベントの登録
Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork);
Worker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(Worker_ProgressChanged);
Worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
// 進捗状況の報告をできるようにする
Worker.WorkerReportsProgress = true;
// キャンセル処理をできるようにする
Worker.WorkerSupportsCancellation = true;
// バックグラウンド処理の実行
Worker.RunWorkerAsync();
}
// [STOP]ボタンクリック時の処理
private void btnStop_Click(object sender, RoutedEventArgs e)
{
if (Worker == null) return;
// バックグラウンド処理をキャンセルする
Worker.CancelAsync();
MessageBox.Show(String.Format("現在値は{0}です", progressBar1.Value));
}
// 時間のかかる処理を実行
void Worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
for (int value = 1; value <= 100; value++)
{
if (Worker.CancellationPending)
break;
Worker.ReportProgress(value);
// 500mSecスリープ
System.Threading.Thread.Sleep(100);
}
}
// 現在値の更新
void Worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
// プログレスバーの現在値を更新する
progressBar1.Value = e.ProgressPercentage;
}
// 「時間のかかる処理」終了時の処理
void Worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
// [START]/[STOP]ボタンの初期化
btnStart.IsEnabled = true;
btnStop.IsEnabled = false;
btnStart.IsEnabled = true;
btnStop.IsEnabled = false;
}
