通常進捗状況は、緑のグラデーションで表されますが、ControlTemplateを使用すると進捗部分およびその背景に任意のイメージを使用することができます。
WPFとSilverlightで、ControlTemplateの記述方法が異なりますので分けて説明します。
WPFでは、ProgressBarの背景部分は「トラック」と呼ばれ、PART_Trackという名前が付けられています。
トラックはBorderコントロールでできており、この中に任意のイメージを設定することで背景にイメージを表示させることができます。
同様に、進捗部分にはPART_Indicatorという名前が付けられており、こちらもBorderコントロールでできています。こちらも任意のイメージを設定することで、進捗部分にイメージが表示されることになります。
このとき Stretch属性に UniformToFillを設定するとイメージの縦横比を保ったまま、進捗状況を表示させることができます。
下記は、背景部分と進捗部分にチューリップの画像を使用する例です。
背景部分には透明度を設定しており、進捗が進むごとにイメージが鮮明になるようにしています。
XAMLの例(WPF)
<Window.Resources> <Style x:Key="{x:Type ProgressBar}" TargetType="{x:Type ProgressBar}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ProgressBar}"> <Grid MinHeight="14" MinWidth="200"> <!-- ProgressBarの背景部分--> <Border Name="PART_Track" CornerRadius="2" BorderThickness="1" Background="#E0E0E0" BorderBrush="#888888"> <Image Source="Images/Tulips.jpg" Stretch="UniformToFill" Opacity="0.5"/> </Border> <!-- ProgressBarのインジケーター部分--> <Border Name="PART_Indicator" CornerRadius="2" BorderThickness="1" BorderBrush="#404040" HorizontalAlignment="Left" > <Image Source="Images/Tulips.jpg" Stretch="UniformToFill"/> </Border> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources> <Grid> <ProgressBar Name="ProgressBar1" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="12,12,0,0" Height="192" Width="256" Minimum="0" Maximum="100" /> <Button Name="btnStart" Content="START" Height="23" HorizontalAlignment="Left" Margin="12,210,0,0" VerticalAlignment="Top" Width="75" /> <Button Name="btnStop" Content="STOP" Height="23" HorizontalAlignment="Right" Margin="0,210,110,0" VerticalAlignment="Top" Width="75" /> </Grid>
Silverlightも、ProgressBarの背景部分は「トラック」と呼ばれ、こちらはProgressBarTrackという名前が付けられています。
トラックはBorderコントロールでできており、Background属性に任意のイメージを設定することで背景にイメージを表示させています。
また、進捗部分にはProgressBarRootGridという名前が付けられており、こちらはGridコントロールでできています。
GridにはRectangleが配置されており、Fill属性に任意のイメージを設定することで、進捗部分にイメージが表示されることになります。
下記は、背景部分と進捗部分にチューリップの画像を使用する例です。
背景部分には透明度を設定しており、進捗が進むごとにイメージが鮮明になるようにしています。
Stretch属性に UniformToFillを設定していますが、WPFとは少し挙動がことなりますので注意してください(WPFでは背景と進捗部分のイメージがピッタリと重なるのですが、Silverlightではズレが生じます)。
XAMLの例(Silverlight)
<navigation:Page.Resources> <Style x:Key="ProgressBarStyle" TargetType="ProgressBar"> <!-- 進捗状況用イメージ --> <Setter Property="Foreground"> <Setter.Value> <ImageBrush ImageSource="../Images/Tulips.jpg" Stretch="UniformToFill"/> </Setter.Value> </Setter> <!-- トラック用イメージ --> <Setter Property="Background"> <Setter.Value> <ImageBrush ImageSource="../Images/Tulips.jpg" Stretch="UniformToFill" Opacity="0.3"/> </Setter.Value> </Setter> <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"/> <!-- 進捗状況表示用 --> <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> </navigation:Page.Resources> <Grid x:Name="LayoutRoot"> <sdk:Label Content="08.進捗状況をイメージで表示する" 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="192" Width="256" Maximum="100" Minimum="0" Style="{StaticResource ProgressBarStyle}"/> <Button Content="START" Height="23" HorizontalAlignment="Left" Margin="12,242,0,0" Name="btnStart" VerticalAlignment="Top" Width="75" /> <Button Content="STOP" Height="23" HorizontalAlignment="Left" Margin="93,242,0,0" Name="btnStop" VerticalAlignment="Top" Width="75" /> </Grid>