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> |