Themes/MaterialDesignTheme.ProgressBar.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:circularProgressBarConverters="clr-namespace:MaterialDesignThemes.Wpf.Converters.CircularProgressBar"
                    xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters"
                    xmlns:transitions="clr-namespace:MaterialDesignThemes.Wpf.Transitions"
                    xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
 
  <Style x:Key="MaterialDesignLinearProgressBar" TargetType="{x:Type ProgressBar}">
    <Setter Property="Background" Value="{DynamicResource MaterialDesign.Brush.Primary.Light}" />
    <Setter Property="BorderBrush" Value="{DynamicResource MaterialDesign.Brush.Primary.Light}" />
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Primary.Dark}" />
    <Setter Property="Height" Value="4" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type ProgressBar}">
          <ControlTemplate.Resources>
            <Storyboard x:Key="OnLoaded">
              <DoubleAnimationUsingKeyFrames Storyboard.TargetName="TemplateRoot" Storyboard.TargetProperty="(UIElement.Opacity)">
                <EasingDoubleKeyFrame KeyTime="0" Value="0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1" />
              </DoubleAnimationUsingKeyFrames>
              <DoubleAnimationUsingKeyFrames Storyboard.TargetName="TemplateRoot" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
                <EasingDoubleKeyFrame KeyTime="0" Value="0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1" />
              </DoubleAnimationUsingKeyFrames>
              <DoubleAnimationUsingKeyFrames Storyboard.TargetName="TemplateRoot" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
                <EasingDoubleKeyFrame KeyTime="0" Value="0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1" />
              </DoubleAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="OnLoadedNoAnimation">
              <DoubleAnimation Storyboard.TargetName="TemplateRoot"
                               Storyboard.TargetProperty="(UIElement.Opacity)"
                               To="1"
                               Duration="0" />
              <DoubleAnimation Storyboard.TargetName="TemplateRoot"
                               Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"
                               To="1"
                               Duration="0" />
              <DoubleAnimation Storyboard.TargetName="TemplateRoot"
                               Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"
                               To="1"
                               Duration="0" />
            </Storyboard>
          </ControlTemplate.Resources>
          <Grid x:Name="TemplateRoot"
                Opacity="0"
                RenderTransformOrigin="0,0.5">
            <Grid.RenderTransform>
              <TransformGroup>
                <ScaleTransform ScaleX="0" ScaleY="0" />
                <SkewTransform />
                <RotateTransform />
                <TranslateTransform />
              </TransformGroup>
            </Grid.RenderTransform>
            <VisualStateManager.VisualStateGroups>
              <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Determinate" />
                <VisualState x:Name="Indeterminate">
                  <Storyboard RepeatBehavior="Forever">
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Animation" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">
                      <EasingDoubleKeyFrame KeyTime="0" Value="0.25" />
                      <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0.25" />
                      <EasingDoubleKeyFrame KeyTime="0:0:2" Value="0.25" />
                    </DoubleAnimationUsingKeyFrames>
                    <PointAnimationUsingKeyFrames Storyboard.TargetName="Animation" Storyboard.TargetProperty="(UIElement.RenderTransformOrigin)">
                      <EasingPointKeyFrame KeyTime="0" Value="-0.5,0.5" />
                      <EasingPointKeyFrame KeyTime="0:0:1" Value="0.5,0.5" />
                      <EasingPointKeyFrame KeyTime="0:0:2" Value="1.5,0.5" />
                    </PointAnimationUsingKeyFrames>
                  </Storyboard>
                </VisualState>
              </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}" />
            <Rectangle x:Name="PART_Track" />
            <Grid x:Name="PART_Indicator"
                  HorizontalAlignment="Left"
                  ClipToBounds="true">
              <Rectangle x:Name="Indicator" Fill="{TemplateBinding Foreground}" />
              <Rectangle x:Name="Animation"
                         Fill="{TemplateBinding Foreground}"
                         RenderTransformOrigin="0.5,0.5">
                <Rectangle.RenderTransform>
                  <TransformGroup>
                    <ScaleTransform />
                    <SkewTransform />
                    <RotateTransform />
                    <TranslateTransform />
                  </TransformGroup>
                </Rectangle.RenderTransform>
              </Rectangle>
            </Grid>
          </Grid>
          <ControlTemplate.Triggers>
            <Trigger Property="wpf:TransitionAssist.DisableTransitions" Value="True">
              <Trigger.EnterActions>
                <BeginStoryboard Name="BeginStoryboardOnLoadedNoAnimation" Storyboard="{StaticResource OnLoadedNoAnimation}" />
              </Trigger.EnterActions>
              <Trigger.ExitActions>
                <RemoveStoryboard BeginStoryboardName="BeginStoryboardOnLoadedNoAnimation" />
              </Trigger.ExitActions>
            </Trigger>
            <MultiTrigger>
              <MultiTrigger.Conditions>
                <Condition Property="IsVisible" Value="True" />
                <Condition Property="wpf:TransitionAssist.DisableTransitions" Value="False" />
              </MultiTrigger.Conditions>
              <MultiTrigger.EnterActions>
                <BeginStoryboard Name="BeginStoryboardOnLoaded" Storyboard="{StaticResource OnLoaded}" />
              </MultiTrigger.EnterActions>
              <MultiTrigger.ExitActions>
                <RemoveStoryboard BeginStoryboardName="BeginStoryboardOnLoaded" />
              </MultiTrigger.ExitActions>
            </MultiTrigger>
            <Trigger Property="Orientation" Value="Vertical">
              <Setter Property="LayoutTransform">
                <Setter.Value>
                  <RotateTransform Angle="-90" />
                </Setter.Value>
              </Setter>
            </Trigger>
            <Trigger Property="IsIndeterminate" Value="true">
              <Setter TargetName="Indicator" Property="Visibility" Value="Collapsed" />
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
 
  <Style x:Key="MaterialDesignCircularProgressBar" TargetType="{x:Type ProgressBar}">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Primary}" />
    <Setter Property="Height" Value="20" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type ProgressBar}">
          <ControlTemplate.Resources>
            <Storyboard x:Key="IsIndeterminateStoryboard"
                        RepeatBehavior="Forever"
                        TargetProperty="Angle"
                        TargetName="RotateTransform">
              <DoubleAnimation From="0"
                               To="359"
                               Duration="0:0:2" />
            </Storyboard>
            <Storyboard x:Key="IsFullyIndeterminateStoryboard">
              <DoubleAnimationUsingKeyFrames RepeatBehavior="Forever"
                                             Storyboard.TargetName="FullyIndeterminateGridScaleTransform"
                                             Storyboard.TargetProperty="ScaleX">
                <SplineDoubleKeyFrame KeyTime="0" Value="0.0" />
                <SplineDoubleKeyFrame KeyTime="0:0:1" Value="1.0" />
                <SplineDoubleKeyFrame KeyTime="0:0:4" Value="0.0" />
              </DoubleAnimationUsingKeyFrames>
              <DoubleAnimation RepeatBehavior="Forever"
                               Storyboard.TargetName="RotateTransform"
                               Storyboard.TargetProperty="Angle"
                               From="00"
                               To="359"
                               Duration="0:0:1.25" />
            </Storyboard>
          </ControlTemplate.Resources>
          <Grid x:Name="TemplateRoot" ClipToBounds="False">
            <Grid x:Name="FullyIndeterminateGrid">
              <Grid.RenderTransform>
                <ScaleTransform x:Name="FullyIndeterminateGridScaleTransform" ScaleX="0" />
              </Grid.RenderTransform>
            </Grid>
            <Grid x:Name="PathGrid" Margin="2" />
            <Canvas>
              <Ellipse Width="{TemplateBinding Width}"
                       Height="{TemplateBinding Height}"
                       Fill="{TemplateBinding Background}" />
              <Path x:Name="Path"
                    Canvas.Left="2"
                    Canvas.Top="2"
                    RenderTransformOrigin="0, 0"
                    Stroke="{TemplateBinding Foreground}"
                    StrokeThickness="3">
                <Path.Data>
                  <PathGeometry>
                    <PathFigure StartPoint="{Binding ElementName=PathGrid, Path=ActualWidth, Converter={x:Static circularProgressBarConverters:StartPointConverter.Instance}, Mode=OneWay}">
                      <ArcSegment Size="{Binding ElementName=PathGrid, Path=ActualWidth, Converter={x:Static circularProgressBarConverters:ArcSizeConverter.Instance}, Mode=OneWay}" SweepDirection="Clockwise">
                        <ArcSegment.Point>
                          <MultiBinding Converter="{x:Static circularProgressBarConverters:ArcEndPointConverter.Instance}" ConverterParameter="{x:Static circularProgressBarConverters:ArcEndPointConverter.ParameterMidPoint}">
                            <Binding ElementName="PathGrid" Path="ActualWidth" />
                            <Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}" />
                            <Binding Path="Minimum" RelativeSource="{RelativeSource TemplatedParent}" />
                            <Binding Path="Maximum" RelativeSource="{RelativeSource TemplatedParent}" />
                            <Binding ElementName="FullyIndeterminateGridScaleTransform" Path="ScaleX" />
                          </MultiBinding>
                        </ArcSegment.Point>
                      </ArcSegment>
                      <ArcSegment Size="{Binding ElementName=PathGrid, Path=ActualWidth, Converter={x:Static circularProgressBarConverters:ArcSizeConverter.Instance}, Mode=OneWay}" SweepDirection="Clockwise">
                        <ArcSegment.Point>
                          <MultiBinding Converter="{x:Static circularProgressBarConverters:ArcEndPointConverter.Instance}">
                            <Binding ElementName="PathGrid" Path="ActualWidth" />
                            <Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}" />
                            <Binding Path="Minimum" RelativeSource="{RelativeSource TemplatedParent}" />
                            <Binding Path="Maximum" RelativeSource="{RelativeSource TemplatedParent}" />
                            <Binding ElementName="FullyIndeterminateGridScaleTransform" Path="ScaleX" />
                          </MultiBinding>
                        </ArcSegment.Point>
                      </ArcSegment>
                    </PathFigure>
                  </PathGeometry>
                </Path.Data>
                <Path.RenderTransform>
                  <TransformGroup>
                    <RotateTransform x:Name="RotateTransform" CenterX="{Binding ElementName=PathGrid, Path=ActualWidth, Converter={x:Static circularProgressBarConverters:RotateTransformCentreConverter.Instance}, Mode=OneWay}" CenterY="{Binding ElementName=PathGrid, Path=ActualWidth, Converter={x:Static circularProgressBarConverters:RotateTransformCentreConverter.Instance}, Mode=OneWay}" />
                  </TransformGroup>
                </Path.RenderTransform>
              </Path>
            </Canvas>
          </Grid>
          <ControlTemplate.Triggers>
            <MultiDataTrigger>
              <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsIndeterminate, RelativeSource={RelativeSource Self}}" Value="True" />
                <Condition Binding="{Binding IsVisible, RelativeSource={RelativeSource Self}}" Value="True" />
                <Condition Binding="{Binding Value, RelativeSource={RelativeSource Self}, Converter={x:Static converters:NotZeroConverter.Instance}}" Value="True" />
              </MultiDataTrigger.Conditions>
              <MultiDataTrigger.EnterActions>
                <BeginStoryboard Name="IsIndeterminateStoryboard" Storyboard="{StaticResource IsIndeterminateStoryboard}" />
              </MultiDataTrigger.EnterActions>
              <MultiDataTrigger.ExitActions>
                <RemoveStoryboard BeginStoryboardName="IsIndeterminateStoryboard" />
              </MultiDataTrigger.ExitActions>
            </MultiDataTrigger>
            <MultiTrigger>
              <MultiTrigger.Conditions>
                <Condition Property="IsIndeterminate" Value="True" />
                <Condition Property="IsVisible" Value="True" />
                <Condition Property="Value" Value="0" />
              </MultiTrigger.Conditions>
              <MultiTrigger.EnterActions>
                <BeginStoryboard Name="IsFullyIndeterminateStoryboard" Storyboard="{StaticResource IsFullyIndeterminateStoryboard}" />
              </MultiTrigger.EnterActions>
              <MultiTrigger.ExitActions>
                <RemoveStoryboard BeginStoryboardName="IsFullyIndeterminateStoryboard" />
              </MultiTrigger.ExitActions>
            </MultiTrigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
    <Setter Property="Width" Value="20" />
  </Style>
 
 
</ResourceDictionary>