Files
Shrlalgo.RvKits/Melskin/Controls/Spin.xaml
2026-02-20 15:31:44 +08:00

215 lines
13 KiB
XML

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:Melskin.Controls"
xmlns:converters="clr-namespace:Melskin.Converters">
<Style TargetType="{x:Type controls:Spin}">
<Setter Property="IsTabStop" Value="False" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Stretch" />
<Setter Property="Foreground" Value="{DynamicResource PrimaryNormalBrush}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:Spin}">
<Grid>
<!-- Content -->
<Border
x:Name="Content"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
ContentTemplate="{TemplateBinding ContentTemplate}"
ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}" />
</Border>
<!-- IndicatorPanel -->
<Grid
x:Name="IndicatorPanel"
VerticalAlignment="Center"
Visibility="{Binding Spinning, RelativeSource={RelativeSource TemplatedParent}, Converter={x:Static converters:BooleanToVisibilityConverter.CollapsedInstance}}">
<Grid.RowDefinitions>
<!-- Icon -->
<RowDefinition />
<!-- Text -->
<RowDefinition />
</Grid.RowDefinitions>
<!-- Indicator -->
<ContentPresenter
x:Name="Indicator"
Grid.RowSpan="2"
Content="{TemplateBinding Indicator}"
Visibility="Hidden" />
<!-- Dot -->
<Grid
x:Name="Dot"
Grid.RowSpan="2"
Width="20"
Height="{Binding Width, Mode=OneWay, RelativeSource={RelativeSource Self}}"
RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<RotateTransform />
</Grid.RenderTransform>
<Grid.Resources>
<Style TargetType="{x:Type Ellipse}">
<Setter Property="Opacity" Value="0.3" />
<Setter Property="RenderTransformOrigin" Value="0.5,0.5" />
<Setter Property="Fill" Value="{DynamicResource PrimaryNormalBrush}" />
<Setter Property="Height" Value="{Binding Width, Mode=OneWay, RelativeSource={RelativeSource Self}}" />
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX="0.75" ScaleY="0.75" />
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<Ellipse
x:Name="Dot1"
Width="9"
HorizontalAlignment="Left"
VerticalAlignment="Top" />
<Ellipse
x:Name="Dot2"
Width="{Binding Width, Mode=OneWay, ElementName=Dot1}"
HorizontalAlignment="Right"
VerticalAlignment="Top" />
<Ellipse
x:Name="Dot3"
Width="{Binding Width, Mode=OneWay, ElementName=Dot1}"
HorizontalAlignment="Left"
VerticalAlignment="Bottom" />
<Ellipse
x:Name="Dot4"
Width="{Binding Width, Mode=OneWay, ElementName=Dot1}"
HorizontalAlignment="Right"
VerticalAlignment="Bottom" />
</Grid>
<ContentPresenter
x:Name="LoadingText"
Grid.Row="1"
Content="{TemplateBinding Tip}" />
</Grid>
<!-- Mask -->
<Rectangle
x:Name="Mask"
Fill="Transparent"
Visibility="Collapsed" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SpinStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.2" From="Spun">
<Storyboard>
<!-- Content -->
<DoubleAnimation Storyboard.TargetName="Content" Storyboard.TargetProperty="Opacity" />
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="Spun">
<Storyboard>
<!-- Content -->
<DoubleAnimation
Storyboard.TargetName="Content"
Storyboard.TargetProperty="Opacity"
To="0.5"
Duration="0:0:0.2" />
<!-- Dot -->
<DoubleAnimation
RepeatBehavior="Forever"
Storyboard.TargetName="Dot"
Storyboard.TargetProperty="RenderTransform.Angle"
From="45"
To="405"
Duration="0:0:1.2" />
<DoubleAnimation
AutoReverse="True"
RepeatBehavior="Forever"
Storyboard.TargetName="Dot1"
Storyboard.TargetProperty="Opacity"
From="0.3"
To="1"
Duration="0:0:1" />
<DoubleAnimation
AutoReverse="True"
BeginTime="0:0:0.4"
RepeatBehavior="Forever"
Storyboard.TargetName="Dot2"
Storyboard.TargetProperty="Opacity"
From="0.3"
To="1"
Duration="0:0:1" />
<DoubleAnimation
AutoReverse="True"
BeginTime="0:0:0.8"
RepeatBehavior="Forever"
Storyboard.TargetName="Dot3"
Storyboard.TargetProperty="Opacity"
From="0.3"
To="1"
Duration="0:0:1" />
<DoubleAnimation
AutoReverse="True"
BeginTime="0:0:1.2"
RepeatBehavior="Forever"
Storyboard.TargetName="Dot4"
Storyboard.TargetProperty="Opacity"
From="0.3"
To="1"
Duration="0:0:1" />
</Storyboard>
</VisualState>
<VisualState x:Name="Unspun" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
<ControlTemplate.Triggers>
<!--<Trigger Property="Size" Value="Small">
<Setter Property="Width" TargetName="Dot1" Value="6" />
<Setter Property="Width" TargetName="Dot" Value="{DynamicResource SpinDotSizeSmall}" />
</Trigger>
<Trigger Property="Size" Value="Large">
<Setter Property="Width" TargetName="Dot1" Value="14" />
<Setter Property="Width" TargetName="Dot" Value="{DynamicResource SpinDotSizeLarge}" />
</Trigger>-->
<!-- Spun State -->
<Trigger Property="Spinning" Value="True">
<Setter TargetName="Mask" Property="Visibility" Value="Visible" />
<Setter TargetName="Content" Property="Effect">
<Setter.Value>
<BlurEffect Radius="2" />
</Setter.Value>
</Setter>
</Trigger>
<!-- With Loading Text -->
<DataTrigger Binding="{Binding Tip, Mode=OneWay, RelativeSource={RelativeSource Self}, Converter={x:Static converters:NullOrEmptyConverter.Instance}}" Value="False">
<Setter TargetName="Dot" Property="Grid.RowSpan" Value="1" />
<Setter TargetName="Indicator" Property="Grid.RowSpan" Value="1" />
<Setter TargetName="LoadingText" Property="Margin" Value="0,8,0,0" />
</DataTrigger>
<!-- Nested Loading -->
<DataTrigger Binding="{Binding Content, Mode=OneWay, RelativeSource={RelativeSource Self}, Converter={x:Static converters:NullOrEmptyConverter.Instance}}" Value="False">
<Setter TargetName="IndicatorPanel" Property="HorizontalAlignment" Value="Center" />
</DataTrigger>
<!-- With Indicator -->
<DataTrigger Binding="{Binding Indicator, Mode=OneWay, RelativeSource={RelativeSource Self}, Converter={x:Static converters:NullOrEmptyConverter.Instance}}" Value="False">
<Setter TargetName="Dot" Property="Visibility" Value="Collapsed" />
<Setter TargetName="Indicator" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<!-- Spun State -->
<Trigger Property="Spinning" Value="True">
<Setter Property="KeyboardNavigation.TabNavigation" Value="None" />
<Setter Property="KeyboardNavigation.DirectionalNavigation" Value="None" />
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>