• 周六. 7 月 27th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

[WPF] 修改进度条样式实现斑马进度条

admin

11 月 28, 2021

属性:

Foreground:进度条的颜色,带动画的模板不适用。

Background:背景色。

BorderBrush:边框颜色。

BorderThickness:边框大小。

pp:BorderElement.CornerRadius:附加属性,圆角大小。

效果展示:

默认样式模板:

<Style x:Key="PP.Styles.ProgressBar" TargetType="{x:Type ProgressBar}">
    <Setter Property="Foreground" Value="{DynamicResource PP.Brushes.Themes}"/>
    <Setter Property="Background" Value="{DynamicResource PP.Brushes.Background}"/>
    <Setter Property="BorderBrush" Value="{DynamicResource PP.Brushes.Black20}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ProgressBar}">
                <Grid x:Name="TemplateRoot">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Determinate"/>
                            <VisualState x:Name="Indeterminate">
                                <Storyboard RepeatBehavior="Forever">
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="Animation">
                                        <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.TargetProperty="(UIElement.RenderTransformOrigin)" Storyboard.TargetName="Animation">
                                        <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 BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="{TemplateBinding attach:BorderElement.CornerRadius}" />
                    <Rectangle x:Name="PART_Track"/>
                    <ctrls:CornerClip CornerRadius="{TemplateBinding attach:BorderElement.CornerRadius}">
                        <Grid x:Name="PART_Indicator" ClipToBounds="True" HorizontalAlignment="Left">
                            <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>
                    </ctrls:CornerClip>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="Orientation" Value="Vertical">
                        <Setter Property="LayoutTransform" TargetName="TemplateRoot">
                            <Setter.Value>
                                <RotateTransform Angle="-90"/>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="IsIndeterminate" Value="True">
                        <Setter Property="Visibility" TargetName="Indicator" Value="Collapsed"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

带动画的样式模板:

<Style x:Key="Page.Styles.ProgressBar" TargetType="{x:Type ProgressBar}" BasedOn="{StaticResource PP.Styles.ProgressBar}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ProgressBar}">
                <Grid x:Name="TemplateRoot">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Determinate">
                                <Storyboard RepeatBehavior="Forever">
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="transX1" Storyboard.TargetProperty="X">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="0" />
                                        <SplineDoubleKeyFrame KeyTime="00:00:.35" Value="20" />
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Indeterminate">
                                <Storyboard RepeatBehavior="Forever">
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="transX2" Storyboard.TargetProperty="X">
                                        <SplineDoubleKeyFrame KeyTime="0" Value="0" />
                                        <SplineDoubleKeyFrame KeyTime="00:00:.35" Value="20" />
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="{TemplateBinding pp:BorderElement.CornerRadius}" />
                    <Rectangle x:Name="PART_Track"/>
                    <pp:CornerClip CornerRadius="{TemplateBinding pp:BorderElement.CornerRadius}">
                        <pp:SimplePanel x:Name="PART_Indicator" ClipToBounds="True" HorizontalAlignment="Left">
                            <pp:SimplePanel.OpacityMask>
                                <LinearGradientBrush EndPoint="0 1">
                                    <GradientStop Offset="1" Color="#FF1359FA" />
                                    <GradientStop Offset="0.7" Color="#FF1359FA" />
                                    <GradientStop Offset="0" Color="#661359FA" />
                                </LinearGradientBrush>
                            </pp:SimplePanel.OpacityMask>
                            <Rectangle x:Name="DeterminateRoot">
                                <Rectangle.Fill>
                                    <LinearGradientBrush MappingMode="Absolute" SpreadMethod="Repeat" EndPoint="20 0">
                                        <LinearGradientBrush.Transform>
                                            <TransformGroup>
                                                <TranslateTransform x:Name="transX1" />
                                                <SkewTransform AngleX="-30" />
                                            </TransformGroup>
                                        </LinearGradientBrush.Transform>
                                        <GradientStop Offset="0" Color="#1359FA" />
                                        <GradientStop Offset="0.2" Color="#1359FA" />
                                        <GradientStop Offset="0.2" Color="#D41359FA" />
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <Rectangle x:Name="IndeterminateRoot" Visibility="Collapsed">
                                <Rectangle.Fill>
                                    <LinearGradientBrush MappingMode="Absolute" SpreadMethod="Repeat" EndPoint="20 0">
                                        <LinearGradientBrush.Transform>
                                            <TransformGroup>
                                                <TranslateTransform x:Name="transX2" />
                                                <SkewTransform AngleX="-30" />
                                            </TransformGroup>
                                        </LinearGradientBrush.Transform>
                                        <GradientStop Offset="0" Color="#1359FA" />
                                        <GradientStop Offset="0.2" Color="#1359FA" />
                                        <GradientStop Offset="0.2" Color="#D41359FA" />
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                        </pp:SimplePanel>
                    </pp:CornerClip>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="Orientation" Value="Vertical">
                        <Setter Property="LayoutTransform" TargetName="TemplateRoot">
                            <Setter.Value>
                                <RotateTransform Angle="-90"/>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="IsIndeterminate" Value="True">
                        <Setter TargetName="IndeterminateRoot" Property="Visibility" Value="Visible" />
                        <Setter TargetName="DeterminateRoot" Property="Visibility" Value="Collapsed" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

更多详情,请查看PP.WPF控件库。

发表回复