WPF 標準コントロールデモアプリ › ProgressBar

ProgressBar Display

ProgressBar は操作の進捗を視覚的に表示するコントロールです。進捗率が分かる確定モード(Determinate)と、進捗が不明な場合のアニメーション表示モード(Indeterminate)をサポートします。

概要

WPF の ProgressBarRangeBase を継承したコントロールで、MinimumMaximumValue プロパティで進捗状況を管理します。Slider と同じ基底クラスを持ちますが、ProgressBar は読み取り専用の表示のみを目的としています。

確定モード(IsIndeterminate="False")では、Value プロパティを MinimumMaximum の範囲でバインドすることで、実際の進捗をバーの幅で表現します。非同期処理のバックグラウンドワーカーからパーセンテージをレポートして ProgressBar の Value を更新するのが一般的なパターンです。

不確定モード(IsIndeterminate="True")では、進捗量が不明な処理(ネットワーク待ち、初期化中など)でアニメーションするストライプまたはドットを表示します。ファイルサイズが不明なダウンロードや長時間かかる検索処理に使用します。

ProgressBar は水平(デフォルト)と垂直の両方向に配置できます。Orientation="Vertical" にすると縦方向に進捗が増加する棒グラフ風の表示になります。

画面キャプチャ

progressbar demo screen

デモしているプロパティ

以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。

プロパティ設定値説明
IsIndeterminateboolネットワーク待ち・初期化処理・ファイルサイズが不明なダウンロードなど、処理の進捗率が事前に計算できない場合に使用します。True にするとバー全体がアニメーションするマーキー表示になり、False(デフォルト)のときは Value に基づいた確定進捗を表示します。IsIndeterminate=True のままコントロールが表示されている限りアニメーションによる CPU 負荷が継続するため、処理が完了したら必ず False に戻し、処理中でない場合は Visibility=Collapsed にしてリソースを解放してください。
OrientationHorizontal / Verticalバッテリー残量表示・縦型の充填インジケーターなど、縦方向の進捗表示が視覚的に適切なデザインで使用します。Horizontal(デフォルト)は左から右に進捗バーが伸び、Vertical は下から上に進捗バーが伸びます。Vertical モードでは値が下から上に増加するため、下端が Minimum・上端が Maximum に対応します。これが直感と逆に感じるデザインではカスタムテンプレートによる調整が必要になります。
Minimum / Maximum (RangeBase)double0〜100 のパーセンテージではなく処理件数や実際のデータ量を直接反映したい場合(例:Minimum=0、Maximum=処理対象ファイル数)に設定します。バーの進捗は (Value - Minimum) / (Maximum - Minimum) の割合で表示され、Minimum=0・Maximum=500 とすれば処理済み件数を Value に直接設定できます。Maximum が 0 または Maximum と Minimum が等しい場合はゼロ除算に相当するレイアウト計算が発生してバーが正しく表示されないため、常に Maximum > Minimum を保証し、空のコレクションをループする前に最大値を確認してください。
Value (RangeBase)doubleバックグラウンドで実行している非同期処理(ファイルコピー・データ処理・ダウンロード)の現在の進捗を反映する際に使用します。IProgress<T> パターンで定期的に報告するのが推奨であり、Minimum〜Maximum の範囲にクランプされた値を進捗バーの幅(または高さ)としてリアルタイムに表示します。バックグラウンドスレッド(Task や Thread)から直接 Value プロパティを設定すると InvalidOperationException(別スレッドからの UI 更新エラー)が発生するため、必ず IProgress<T> または Dispatcher.Invoke を使って UI スレッドで更新してください。

XAML 使用例

<!-- 確定モード -->
<ProgressBar Minimum="0" Maximum="100"
             Value="{Binding Progress}"
             Height="20" Width="300" />

<!-- 不確定モード(アニメーション) -->
<ProgressBar IsIndeterminate="True"
             Height="20" Width="300"
             Visibility="{Binding IsLoading,
               Converter={StaticResource BoolToVisibilityConverter}}" />

<!-- 縦向き -->
<ProgressBar Orientation="Vertical"
             Minimum="0" Maximum="100"
             Value="{Binding BatteryLevel}"
             Width="20" Height="100" />

主な使用例

ヒントとベストプラクティス

関連コントロール

ソースコード

このデモ画面のソースコードは GitHub で公開しています。

GitHub で ProgressBar のソースコードを見る →