SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight/WPFで使える逆引きTips集

Silverlight/WPFで使える逆引きTips集
――プログレスバー機能

(9) ProgressBarコントロール

  • X ポスト
  • このエントリーをはてなブックマークに追加

02.進捗状況値の取得/設定をする

 進捗状況値の取得/設定を行うには 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;
}
ポイント

 進捗状況の値を取得/設定するにはValueプロパティを使用する。 

次のページ
03.進捗状況の表示方法を設定する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlight/WPFで使える逆引きTips集連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5758 2011/02/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング