通常、進捗状況は緑のグラデーション、背景はグレーのグラデーションで表示されていますが、コントロールテンプレートを使用するとで任意の色に変更することができます。
WPFとSilverlightではコードが異なりますので、分けて解説します。
WPFのProgressBarは下図に示すグラデーションの組み合わせで構成することとします。
グラデーションの構成 名称説明 TrackBackground トラック部分の背景に使用 IndicatorBackground 進捗部分の背景に使用 LightingTop 進捗部分上部の光沢に使用 LightingBottom 進捗部分下部の光沢に使用
上記のグラデーションはリソースとして定義し、コントロールテンプレート内でバインディングします。
背景部分は Part_Trackと名前が付けられたBorder要素で、進捗部分はPart_Indicatorと名前が付けられたGrid内のRectangle要素でバインディングしています。
下記はコントロールテンプレートを使用して色をカスタマイズした例です。
XAMLの例(WPF)
<Window.Resources>
<!-- トラックのバックグラウンド -->
<LinearGradientBrush x:Key="TrackBackground" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFFBFBFB" Offset="0"/>
<GradientStop Color="#FFB1B1B1" Offset="1"/>
</LinearGradientBrush>
<!-- インジケーターのバックグラウンド -->
<LinearGradientBrush x:Key="IndicatorBackground" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFE7EFF7" Offset="0"/>
<GradientStop Color="#FF7FBFFF" Offset="0.5"/>
<GradientStop Color="#FF0A4178" Offset="1"/>
</LinearGradientBrush>
<!-- 光沢上部 -->
<LinearGradientBrush x:Key="LightingTop"
StartPoint="0,0" EndPoint="0,0.5">
<GradientStop Offset="0" Color="#CCFFFFFF" />
<GradientStop Offset="0.1" Color="#CCFFFFFF" />
<GradientStop Offset="0.4" Color="#99FFFFFF" />
<GradientStop Offset="1" Color="#00FFFFFF" />
</LinearGradientBrush>
<!-- 光沢下部-->
<RadialGradientBrush x:Key="LightingBottom"
GradientOrigin="0.5,1.0"
Center="0.5,1.0" RadiusX="1" RadiusY="0.1">
<RadialGradientBrush.GradientStops>
<GradientStop Color="#AAFFFFFF" Offset="0" />
<GradientStop Color="#00FFFFFF" Offset="1" />
</RadialGradientBrush.GradientStops>
</RadialGradientBrush>
<!-- ProgressBarのサイズ設定 -->
<Style TargetType="ProgressBar" x:Key="ProgressBarSize">
<Setter Property="Width" Value="100" />
<Setter Property="Height" Value="100" />
<Setter Property="Margin" Value="10,0,0,10" />
</Style>
<!-- プログレスバースタイルを定義 -->
<Style TargetType="ProgressBar" x:Key="RectangleProgressBar">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ProgressBar">
<Grid>
<Border Name="PART_Track" CornerRadius="1" BorderThickness="1"
Background="{StaticResource TrackBackground}"
BorderBrush="{TemplateBinding BorderBrush}"/>
<Grid Name="PART_Indicator" HorizontalAlignment="Left" >
<Rectangle x:Name="prgBackground" Margin="0" RadiusX="1" RadiusY="1"
Fill="{StaticResource IndicatorBackground}" />
<Rectangle x:Name="Highlight1" Margin="1" RadiusX="1" RadiusY="1"
Fill="{StaticResource LightingTop}" />
<Rectangle x:Name="Highlight2" Margin="0" RadiusX="1" RadiusY="1"
Fill="{StaticResource LightingBottom}" />
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<ProgressBar Name="ProgressBar1"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="12,12,0,0" Height="25" Width="254"
Minimum="0" Maximum="100"
Style="{StaticResource RectangleProgressBar}"/>
<Button Content="START" Height="23" HorizontalAlignment="Left" Margin="12,43,0,0" Name="btnStart" VerticalAlignment="Top" Width="75" />
<Button Content="STOP" Height="23" Margin="93,43,110,0" Name="btnStop" VerticalAlignment="Top" />
</Grid>
SilverlightのProgressBarは下図に示すグラデーションの組み合わせで構成することとします。
グラデーションの構成 名称説明 TrackBackground トラック部分の背景に使用 IndicatorBackground 進捗部分の背景に使用
上記のグラデーションはリソースとして定義し、コントロールテンプレート内でバインディングします。
背景部分は ProgressBarTrackと名前が付けられたBorder要素で、進捗部分はProgressBarRootGridと名前が付けられたGrid内のRectangle要素でバインディングしています。
下記はコントロールテンプレートを使用して色をカスタマイズした例です。
XAMLの例
<Grid.Resources>
<Style x:Key="ProgressBarStyle" TargetType="ProgressBar">
<!-- トラック部分の背景 -->
<Setter Property="Foreground">
<Setter.Value>
<LinearGradientBrush EndPoint=".5,1" StartPoint=".5,0">
<GradientStop Color="#FFF9F9F7" Offset="0"/>
<GradientStop Color="#FFC63131" Offset="0.5"/>
<GradientStop Color="#FFEF9437" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<!-- 進捗部分の背景 -->
<Setter Property="Background" Value="Gray"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Maximum" Value="100"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ProgressBar">
<Grid x:Name="Root">
<Border x:Name="ProgressBarTrack" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
CornerRadius="3">
</Border>
<Grid x:Name="ProgressBarRootGrid">
<Grid x:Name="DeterminateRoot" Margin="1">
<Rectangle x:Name="ProgressBarIndicator" Fill="{TemplateBinding Foreground}" HorizontalAlignment="Left"
Margin="{TemplateBinding BorderThickness}" RadiusY="1.5" RadiusX="1.5" StrokeThickness="0.5"/>
</Grid>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<sdk:Label Content="09.色をカスタマイズする" FontSize="16" Height="28" HorizontalAlignment="Left"
Margin="10,10,0,0" Name="Label1" VerticalAlignment="Top" Width="616" />
<ProgressBar Name="ProgressBar1"
VerticalAlignment="Top" HorizontalAlignment="Left"
Margin="12,44,0,0" Height="23" Width="256"
Maximum="100" Minimum="0"
Style="{StaticResource ProgressBarStyle}"/>
<Button Content="START" Height="23" HorizontalAlignment="Left" Margin="12,73,0,0" Name="btnStart" VerticalAlignment="Top" Width="75" />
<Button Content="STOP" Height="23" HorizontalAlignment="Left" Margin="93,73,0,0" Name="btnStop" VerticalAlignment="Top" Width="75" />



