<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:PasswordApp.WPF.Style"xmlns:converters="clr-namespace:Common.WPF.Converters"><Stylex:Key="RoundProgressBarStyle"TargetType="{x:Type ProgressBar}"xmlns:sys="clr-namespace:System;assembly=mscorlib"><Style.Resources><converters:RoundProgressPathConverterx:Key="RoundProgressPathConverter"/><!-- нам понадобится пара констант --><!-- доля рабиуса для внутренней части --><sys:Doublex:Key="RelativeThickness">0.75</sys:Double><!-- просто 0 --><sys:Doublex:Key="Zero">0.0</sys:Double><!-- просто 1 --><sys:Doublex:Key="One">1.0</sys:Double><!-- какой процент рисовать для неопределённого состояния --><sys:Doublex:Key="IndeterminatePart">0.25</sys:Double><!-- обычно прогресс по умолчанию зелёный --><SolidColorBrushx:Key="ProgressBar.Progress"Color="#FF06B025"/><!-- стандартный фон --><SolidColorBrushx:Key="ProgressBar.Background"Color="#FFE6E6E6"/><!-- стандартный цвет границы --><SolidColorBrushx:Key="ProgressBar.Border"Color="#FFBCBCBC"/></Style.Resources><SetterProperty="Foreground"Value="{StaticResource ProgressBar.Progress}"/><SetterProperty="Background"Value="{StaticResource ProgressBar.Background}"/><SetterProperty="BorderBrush"Value="{StaticResource ProgressBar.Border}"/><SetterProperty="BorderThickness"Value="1"/><SetterProperty="Template"><Setter.Value><ControlTemplateTargetType="{x:Type ProgressBar}"><Gridx:Name="TemplateRoot"><!-- в неопределённом состоянии запускаем вращающуюся анимацию --><VisualStateManager.VisualStateGroups><VisualStateGroupx:Name="CommonStates"><VisualStatex:Name="Determinate"/><VisualStatex:Name="Indeterminate"><StoryboardRepeatBehavior="Forever"><DoubleAnimationStoryboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)"Storyboard.TargetName="Animation"From="0"To="360"Duration="0:0:2"/></Storyboard></VisualState></VisualStateGroup></VisualStateManager.VisualStateGroups><!-- это фон, красим его в цвет фона--><PathFill="{TemplateBinding Background}"Stretch="Uniform"Stroke="{TemplateBinding BorderBrush}"StrokeThickness="{TemplateBinding BorderThickness}"><Path.Data><MultiBindingConverter="{StaticResource RoundProgressPathConverter}"ConverterParameter="{StaticResource RelativeThickness}"><!-- val=1, min=0, max=1 даёт полный круг --><BindingSource="{StaticResource One}"/><BindingSource="{StaticResource Zero}"/><BindingSource="{StaticResource One}"/></MultiBinding></Path.Data></Path><PathFill="{TemplateBinding Foreground}"Stretch="Uniform"Name="Indicator"><Path.Data><MultiBindingConverter="{StaticResource RoundProgressPathConverter}"ConverterParameter="{StaticResource RelativeThickness}"><BindingPath="Value"RelativeSource="{RelativeSource TemplatedParent}"/><BindingPath="Minimum"RelativeSource="{RelativeSource TemplatedParent}"/><BindingPath="Maximum"RelativeSource="{RelativeSource TemplatedParent}"/></MultiBinding></Path.Data></Path><!-- это анимировнная штука, будет показываться в неопределённом состоянии --><PathFill="{TemplateBinding Foreground}"Stretch="Uniform"Name="Animation"Visibility="Collapsed"RenderTransformOrigin="0.5,0.5"><Path.Data><MultiBindingConverter="{StaticResource RoundProgressPathConverter}"ConverterParameter="{StaticResource RelativeThickness}"><BindingSource="{StaticResource IndeterminatePart}"/><BindingSource="{StaticResource Zero}"/><BindingSource="{StaticResource One}"/></MultiBinding></Path.Data><!-- положим пустое вращение, чтобы к нему цеплялась анимация --><Path.RenderTransform><RotateTransform/></Path.RenderTransform></Path></Grid><ControlTemplate.Triggers><!-- в случае неопределённого состояния уберём нормальный индикатор и покажем анимацию --><TriggerProperty="IsIndeterminate"Value="true"><SetterProperty="Visibility"TargetName="Indicator"Value="Collapsed"/><SetterProperty="Visibility"TargetName="Animation"Value="Visible"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary>