本TipsはWPFのみとなります。あらかじめご了承ください。
コントロールテンプレートを変更することで、任意の形状のProgressBarを作成することが可能です。
ここでは、円形のProgressBarを作成する方法について説明します。
「進捗状況をイメージで表示する」や「色をカスタマイズする」に掲載したコントロールテンプレートを見ると、ProgressBarのトラック部分はBorderで、進捗部分はGridとRectangleで構成されていることがわかります。
そこで、トラック部分をEllipseを使用して円形にし、その内側をVisualBrushで塗りつぶします。
VisualBrushはトラック領域用のBorder、進捗領域用のGridおよびRectangleを配置してます。
進捗部分の塗りつぶしのグラデーションはリソース部に定義していますので、好みに合わせて変更してください。
下記はコントロールテンプレートを使用してProgressBarを円形にする例です。
XAMLの例
<Window.Resources> <!-- インジケーターのバックグラウンド --> <LinearGradientBrush x:Key="IndicatorBackground" StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#FF00FF00" /> <GradientStop Offset="0.5" Color="#FF00FF00" /> <GradientStop Offset="1" Color="#AA00FF00" /> </LinearGradientBrush> <!-- 光沢上部 --> <LinearGradientBrush x:Key="LightingTop" StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#CCFFFFFF" /> <GradientStop Offset="0.1" Color="#CCFFFFFF" /> <GradientStop Offset="0.4" Color="#99FFFFFF" /> <GradientStop Offset="0.5" 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 x:Key="EllipseProgressBar" TargetType="ProgressBar" BasedOn="{StaticResource ProgressBarSize}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ProgressBar"> <Ellipse Name="PART_Track" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="{TemplateBinding BorderThickness}" > <Ellipse.Fill> <VisualBrush> <VisualBrush.Visual> <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Background="{TemplateBinding Background}"> <Grid Name="PART_Indicator" HorizontalAlignment="Left" > <Rectangle Margin="0" RadiusX="1" RadiusY="1" Fill="{StaticResource IndicatorBackground}" > </Rectangle> <Rectangle Margin="0" Fill="{StaticResource LightingTop}" /> <Rectangle Margin="0" Fill="{StaticResource LightingBottom}" /> </Grid> </Border> </VisualBrush.Visual> </VisualBrush> </Ellipse.Fill> </Ellipse> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources> <Grid> <ProgressBar Name="ProgressBar1" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="41,12,0,0" Height="100" Width="100" Minimum="0" Maximum="100" Style="{StaticResource EllipseProgressBar}" /> <Button Content="START" Height="23" HorizontalAlignment="Left" Margin="12,116,0,0" Name="btnStart" VerticalAlignment="Top" Width="75" /> <Button Content="STOP" Height="23" Margin="92,116,0,0" Name="btnStop" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" /> </Grid>