Share via


ProgressRing styles and templates

[ This article is for Windows 8.x and Windows Phone 8.x developers writing Windows Runtime apps. If you’re developing for Windows 10, see the latest documentation ]

This topic describes the styles and templates for the ProgressRing control. You can modify these resources and the default ControlTemplate to give the control a unique appearance.

Visual states

These are the VisualStates defined in the control's default style.

VisualState name VisualStateGroup name Description
Large SizeStates The control is its large size.
Small SizeStates The control is its default size.
Active ActiveStates The control is active.
Inactive ActiveStates The control is not active.

 

Theme resources

These resources are used in the control's default style.

Dark theme brushes

To change the colors of the control in the dark theme, override these brushes in App.xaml.

<SolidColorBrush x:Key="ProgressBarBackgroundThemeBrush" Color="#59FFFFFF" />
<SolidColorBrush x:Key="ProgressBarBorderThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="ProgressBarForegroundThemeBrush" Color="#FF5B2EC5" />
<SolidColorBrush x:Key="ProgressBarIndeterminateForegroundThemeBrush" Color="#FF8A57FF" />

Light theme brushes

To change the colors of the control in the light theme, override these brushes in App.xaml.

<SolidColorBrush x:Key="ProgressBarBackgroundThemeBrush" Color="#30000000" />
<SolidColorBrush x:Key="ProgressBarBorderThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="ProgressBarForegroundThemeBrush" Color="#FF4617B4" />
<SolidColorBrush x:Key="ProgressBarIndeterminateForegroundThemeBrush" Color="#FF4617B4" />

Other resources

<x:Double x:Key="ProgressBarThemeMinHeight">6</x:Double>
<Thickness x:Key="ProgressBarBorderThemeThickness">0</Thickness>

For more info on theme resources, including the values that are used for the HighContrast theme, see XAML theme resources reference.

Default style

<!-- Default style for Windows.UI.Xaml.Controls.ProgressRing -->
<Style TargetType="ProgressRing">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Foreground" Value="{ThemeResource ProgressBarIndeterminateForegroundThemeBrush}" />
    <Setter Property="IsHitTestVisible" Value="False" />
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="MinHeight" Value="20" />
    <Setter Property="MinWidth" Value="20" />
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ProgressRing">
                <Border Background="{TemplateBinding Background}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        BorderBrush="{TemplateBinding BorderBrush}">
                    <Border.Resources>
                        <Style x:Key="ProgressRingEllipseStyle" TargetType="Ellipse">
                            <Setter Property="Opacity" Value="0" />
                            <Setter Property="HorizontalAlignment" Value="Left" />
                            <Setter Property="VerticalAlignment" Value="Top" />
                        </Style>
                    </Border.Resources>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="SizeStates">
                            <VisualState x:Name="Large">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Duration="0"
                                                                   Storyboard.TargetName="SixthCircle"
                                                                   Storyboard.TargetProperty="Visibility">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <Visibility>Visible</Visibility>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Small" />
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="ActiveStates">
                            <VisualState x:Name="Inactive" />
                            <VisualState x:Name="Active">
                                <Storyboard RepeatBehavior="Forever">
                                    <ObjectAnimationUsingKeyFrames Duration="0"
                                                                   Storyboard.TargetName="Ring"
                                                                   Storyboard.TargetProperty="Visibility">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <Visibility>Visible</Visibility>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E1"
                                        Storyboard.TargetProperty="Opacity"
                                        BeginTime="0">
                                        <DiscreteDoubleKeyFrame KeyTime="0" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.21" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.22" Value="0" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.47" Value="0" />
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E2"
                                        Storyboard.TargetProperty="Opacity"
                                        BeginTime="00:00:00.167">
                                        <DiscreteDoubleKeyFrame KeyTime="0" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.21" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.22" Value="0" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.47" Value="0" />
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E3"
                                        Storyboard.TargetProperty="Opacity"
                                        BeginTime="00:00:00.334">
                                        <DiscreteDoubleKeyFrame KeyTime="0" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.21" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.22" Value="0" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.47" Value="0" />
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E4"
                                        Storyboard.TargetProperty="Opacity"
                                        BeginTime="00:00:00.501">
                                        <DiscreteDoubleKeyFrame KeyTime="0" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.21" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.22" Value="0" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.47" Value="0" />
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E5"
                                        Storyboard.TargetProperty="Opacity"
                                        BeginTime="00:00:00.668">
                                        <DiscreteDoubleKeyFrame KeyTime="0" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.21" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.22" Value="0" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.47" Value="0" />
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E6"
                                        Storyboard.TargetProperty="Opacity"
                                        BeginTime="00:00:00.835">
                                        <DiscreteDoubleKeyFrame KeyTime="0" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.21" Value="1" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.22" Value="0" />
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:3.47" Value="0" />
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E1R"
                                        BeginTime="0"
                                        Storyboard.TargetProperty="Angle">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="-110" KeySpline="0.13,0.21,0.1,0.7"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:0.433" Value="10" KeySpline="0.02,0.33,0.38,0.77"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="93"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.617" Value="205" KeySpline="0.57,0.17,0.95,0.75"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.017" Value="357" KeySpline="0,0.19,0.07,0.72"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.783" Value="439"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:3.217" Value="585" KeySpline="0,0,0.95,0.37"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E2R"
                                        BeginTime="00:00:00.167"
                                        Storyboard.TargetProperty="Angle">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="-116" KeySpline="0.13,0.21,0.1,0.7"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:0.433" Value="4" KeySpline="0.02,0.33,0.38,0.77"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="87"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.617" Value="199" KeySpline="0.57,0.17,0.95,0.75"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.017" Value="351" KeySpline="0,0.19,0.07,0.72"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.783" Value="433"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:3.217" Value="579" KeySpline="0,0,0.95,0.37"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E3R"
                                        BeginTime="00:00:00.334"
                                        Storyboard.TargetProperty="Angle">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="-122" KeySpline="0.13,0.21,0.1,0.7"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:0.433" Value="-2" KeySpline="0.02,0.33,0.38,0.77"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="81"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.617" Value="193" KeySpline="0.57,0.17,0.95,0.75"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.017" Value="345" KeySpline="0,0.19,0.07,0.72"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.783" Value="427"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:3.217" Value="573" KeySpline="0,0,0.95,0.37"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E4R"
                                        BeginTime="00:00:00.501"
                                        Storyboard.TargetProperty="Angle">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="-128" KeySpline="0.13,0.21,0.1,0.7"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:0.433" Value="-8" KeySpline="0.02,0.33,0.38,0.77"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="75"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.617" Value="187" KeySpline="0.57,0.17,0.95,0.75"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.017" Value="339" KeySpline="0,0.19,0.07,0.72"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.783" Value="421"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:3.217" Value="567" KeySpline="0,0,0.95,0.37"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E5R"
                                        BeginTime="00:00:00.668"
                                        Storyboard.TargetProperty="Angle">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="-134" KeySpline="0.13,0.21,0.1,0.7"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:0.433" Value="-14" KeySpline="0.02,0.33,0.38,0.77"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="69"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.617" Value="181" KeySpline="0.57,0.17,0.95,0.75"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.017" Value="331" KeySpline="0,0.19,0.07,0.72"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.783" Value="415"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:3.217" Value="561" KeySpline="0,0,0.95,0.37"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames
                                        Storyboard.TargetName="E6R"
                                        BeginTime="00:00:00.835"
                                        Storyboard.TargetProperty="Angle">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="-140" KeySpline="0.13,0.21,0.1,0.7"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:0.433" Value="-20" KeySpline="0.02,0.33,0.38,0.77"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.2" Value="63"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:1.617" Value="175" KeySpline="0.57,0.17,0.95,0.75"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.017" Value="325" KeySpline="0,0.19,0.07,0.72"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:2.783" Value="409"/>
                                        <SplineDoubleKeyFrame KeyTime="0:0:3.217" Value="555" KeySpline="0,0,0.95,0.37"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Grid x:Name="Ring"
                          Margin="{TemplateBinding Padding}"
                          MaxWidth="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.MaxSideLength}"
                          MaxHeight="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.MaxSideLength}"
                          Visibility="Collapsed"
                          RenderTransformOrigin=".5,.5"
                          FlowDirection="LeftToRight">
                        <Canvas RenderTransformOrigin=".5,.5">
                            <Canvas.RenderTransform>
                                <RotateTransform x:Name="E1R" />
                            </Canvas.RenderTransform>
                            <Ellipse
                                x:Name="E1"
                                Style="{StaticResource ProgressRingEllipseStyle}"
                                Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseOffset}"
                                Fill="{TemplateBinding Foreground}"/>
                        </Canvas>
                        <Canvas RenderTransformOrigin=".5,.5">
                            <Canvas.RenderTransform>
                                <RotateTransform x:Name="E2R" />
                            </Canvas.RenderTransform>
                            <Ellipse
                                x:Name="E2"
                                Style="{StaticResource ProgressRingEllipseStyle}"
                                Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseOffset}"
                                Fill="{TemplateBinding Foreground}"/>
                        </Canvas>
                        <Canvas RenderTransformOrigin=".5,.5">
                            <Canvas.RenderTransform>
                                <RotateTransform x:Name="E3R" />
                            </Canvas.RenderTransform>
                            <Ellipse
                                x:Name="E3"
                                Style="{StaticResource ProgressRingEllipseStyle}"
                                Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseOffset}"
                                Fill="{TemplateBinding Foreground}"/>
                        </Canvas>
                        <Canvas RenderTransformOrigin=".5,.5">
                            <Canvas.RenderTransform>
                                <RotateTransform x:Name="E4R" />
                            </Canvas.RenderTransform>
                            <Ellipse
                                x:Name="E4"
                                Style="{StaticResource ProgressRingEllipseStyle}"
                                Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseOffset}"
                                Fill="{TemplateBinding Foreground}"/>
                        </Canvas>
                        <Canvas RenderTransformOrigin=".5,.5">
                            <Canvas.RenderTransform>
                                <RotateTransform x:Name="E5R" />
                            </Canvas.RenderTransform>
                            <Ellipse
                                x:Name="E5"
                                Style="{StaticResource ProgressRingEllipseStyle}"
                                Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseOffset}"
                                Fill="{TemplateBinding Foreground}"/>
                        </Canvas>
                        <Canvas RenderTransformOrigin=".5,.5"
                                Visibility="Collapsed"
                                x:Name="SixthCircle">
                            <Canvas.RenderTransform>
                                <RotateTransform x:Name="E6R" />
                            </Canvas.RenderTransform>
                            <Ellipse
                                x:Name="E6"
                                Style="{StaticResource ProgressRingEllipseStyle}"
                                Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseDiameter}"
                                Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.EllipseOffset}"
                                Fill="{TemplateBinding Foreground}"/>
                        </Canvas>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>