WPF进度条渲染

Xaml中:

<Window.Resources>

<local:BorderClipConverter x:Key="BorderClipConverter" />

<Style x:Key="BorderClip" TargetType="{x:Type Border}">

<Setter Property="UIElement.Clip">

<Setter.Value>

<MultiBinding Converter="{StaticResource BorderClipConverter}">

<Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}" />

<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}" />

<Binding Path="CornerRadius" RelativeSource="{RelativeSource Self}" />

</MultiBinding>

</Setter.Value>

</Setter>

</Style>

</Window.Resources>

<Grid>

<ProgressBar

Width="570"

Height="28"

Margin="0,68,0,0"

Value="100">

<ProgressBar.Resources>

<Style TargetType="ProgressBar">

<Setter Property="BorderThickness" Value="0" />

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="{x:Type ProgressBar}">

<Border

Name="TemplateRoot"

Background="{TemplateBinding Background}"

BorderBrush="{TemplateBinding BorderBrush}"

BorderThickness="{TemplateBinding BorderThickness}"

CornerRadius="20">

<Grid>

<Rectangle Name="PART_Track" />

<Border

Name="PART_Indicator"

HorizontalAlignment="Left"

Background="#ECECEC"

CornerRadius="20"

Style="{StaticResource BorderClip}">

<Grid>

<Rectangle

Name="PART_GlowRect"

Width="100"

HorizontalAlignment="Left"

Fill="#19BE6B"

RadiusX="20"

RadiusY="20" />

<Rectangle

Name="Animation"

Fill="{TemplateBinding Foreground}"

RenderTransformOrigin="0.5,0.5"

Visibility="Collapsed">

<Rectangle.RenderTransform>

<TransformGroup>

<ScaleTransform />

</TransformGroup>

</Rectangle.RenderTransform>

</Rectangle>

</Grid>

</Border>

</Grid>

</Border>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

</ProgressBar.Resources>

</ProgressBar>

<Button

Height="28"

Click="Button_Click"

Content="进度条百分" />

<ProgressBar

Name="progressBar1"

Width="570"

Height="28"

Margin="0,200,0,0" >

<ProgressBar.Resources>

<Style TargetType="{x:Type ProgressBar}">

<Setter Property="Background" Value="#19BE6B" />

<Setter Property="FontSize" Value="30" />

<Setter Property="Padding" Value="5,0" />

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="{x:Type ProgressBar}">

<Grid>

<Border

Background="#ECECEC"

BorderThickness="0"

CornerRadius="20" />

<Grid Margin="{TemplateBinding BorderThickness}">

<Rectangle x:Name="PART_Track" />

<Border

x:Name="PART_Indicator"

HorizontalAlignment="Left"

ClipToBounds="True"

Style="{StaticResource BorderClip}">

<Grid RenderTransformOrigin="0.5,0.5">

<Grid.RenderTransform>

<TransformGroup>

<ScaleTransform ScaleX="1" ScaleY="-1" />

<SkewTransform AngleX="0" AngleY="0" />

<RotateTransform Angle="180" />

<TranslateTransform />

</TransformGroup>

</Grid.RenderTransform>

<Border Background="{TemplateBinding Background}" CornerRadius="20">

<Viewbox

Margin="{TemplateBinding Padding}"

HorizontalAlignment="Left"

SnapsToDevicePixels="True"

StretchDirection="DownOnly">

<TextBlock

VerticalAlignment="Center"

FontSize="{TemplateBinding FontSize}"

Foreground="#ffffff"

RenderTransformOrigin="0.5,0.5"

SnapsToDevicePixels="True"

Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value, StringFormat={}{0}%}">

<TextBlock.RenderTransform>

<TransformGroup>

<ScaleTransform ScaleX="-1" ScaleY="1" />

<SkewTransform AngleX="0" AngleY="0" />

<RotateTransform Angle="0" />

<TranslateTransform />

</TransformGroup>

</TextBlock.RenderTransform>

</TextBlock>

</Viewbox>

</Border>

<Border

BorderBrush="#000000"

BorderThickness="1"

CornerRadius="20"

Opacity="0.1" />

</Grid>

</Border>

</Grid>

</Grid>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

</ProgressBar.Resources>

</ProgressBar>

</Grid>

CS中:

public class BorderClipConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length == 3)
{
object obj = values[0];
if (obj is double)
{
double num = (double)obj;
obj = values[1];
if (obj is double)
{
double num2 = (double)obj;
obj = values[2];
if (obj is CornerRadius)
{
CornerRadius cornerRadius = (CornerRadius)obj;
if (num < double.Epsilon || num2 < double.Epsilon)
{
return Geometry.Empty;
}

PathGeometry pathGeometry = new PathGeometry();
pathGeometry.Figures = new PathFigureCollection
{
new PathFigure(new Point(cornerRadius.TopLeft, 0.0), new PathSegment[8]
{
new LineSegment(new Point(num - cornerRadius.TopRight, 0.0), isStroked: false),
new ArcSegment(new Point(num, cornerRadius.TopRight), new Size(cornerRadius.TopRight, cornerRadius.TopRight), 90.0, isLargeArc: false, SweepDirection.Clockwise, isStroked: false),
new LineSegment(new Point(num, num2 - cornerRadius.BottomRight), isStroked: false),
new ArcSegment(new Point(num - cornerRadius.BottomRight, num2), new Size(cornerRadius.BottomRight, cornerRadius.BottomRight), 90.0, isLargeArc: false, SweepDirection.Clockwise, isStroked: false),
new LineSegment(new Point(cornerRadius.BottomLeft, num2), isStroked: false),
new ArcSegment(new Point(0.0, num2 - cornerRadius.BottomLeft), new Size(cornerRadius.BottomLeft, cornerRadius.BottomLeft), 90.0, isLargeArc: false, SweepDirection.Clockwise, isStroked: false),
new LineSegment(new Point(0.0, cornerRadius.TopLeft), isStroked: false),
new ArcSegment(new Point(cornerRadius.TopLeft, 0.0), new Size(cornerRadius.TopLeft, cornerRadius.TopLeft), 90.0, isLargeArc: false, SweepDirection.Clockwise, isStroked: false)
}, closed: false)
};
pathGeometry.Freeze();
return pathGeometry;
}
}
}
}

return DependencyProperty.UnsetValue;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

事件方法

private void Button_Click(object sender, RoutedEventArgs e)
{
//测试代码
Thread thread = new Thread(new ThreadStart(() =>
{
for (int i = 0; i <= 100; i++)
{
this.progressBar1.Dispatcher.BeginInvoke((ThreadStart)delegate { this.progressBar1.Value = i; });
Thread.Sleep(300);
}
}));
thread.Start();
//测试代码
}

相关推荐
BillKu几秒前
Vue3应用执行流程详解
前端·javascript·vue.js
欧阳天风11 分钟前
链表运用到响应式中
javascript·数据结构·链表
Codebee16 分钟前
OneCode 移动套件多平台适配详细报告
前端·人工智能
你知唔知咩系timing啊19 分钟前
🎙️ 站在巨人肩膀上:基于 SenseVoice.cpp 的前端语音识别实践
前端
一位搞嵌入式的 genius19 分钟前
前端开发核心技术与工具全解析:从构建工具到实时通信
前端·笔记
littleplayer21 分钟前
Redux 中›ABC三个页面是如何通信的?
前端
安卓开发者21 分钟前
鸿蒙NEXT的Web组件网络安全与隐私保护实践
前端·web安全·harmonyos
程序员NEO30 分钟前
3分钟搞定Vue组件库
前端
程序员NEO33 分钟前
WebStorm代码一键美化
前端
前端农民工ws1 小时前
Vue 框架的 markdown 渲染组件,针对 AI 的 markdown 流式传输场景
前端·javascript·vue.js·ai