WPF 绕圈进度条

Posted 唐宋元明清的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 绕圈进度条相关的知识,希望对你有一定的参考价值。

一 以前的方案

以前写过一个圆点绕圈的进度条,根据参数圆点个数和参数每次旋转角度,主要是在cs文件中动态添加圆点,通过后台定时器,动态设置角度后用正弦余弦计算(x,y)的位置。

此方案优点:动态添加Loading的圆点个数和Loading速度

此方案缺点:后台定时器耗性能

WPF 绕圈进度条(一)

二 现在的方案

如果有UI图标,或者自己能够设计矢量图的情况下,可以通过Xaml实现绕圈动画的设置。如下图

添加矢量-Geometry图标

首先通过矢量设计工具,编辑并生成一个绕圈的进度图标(含有8个Path),得到8个StreamGeometry。

比如下面的24*24的图标:

 1 <Grid x:Name="RootGrid" Width="24" Height="24">
 2     <Path x:Name="Part1" Opacity="0.16" Fill="{Binding ForegroundBrush}" Data="M20.631728,19.631728C20.0459415,20.2175144,19.0961941,20.2175144,18.5104076,19.631728L16.3890873,17.5104076C15.8033009,16.9246212 15.8033009,15.9748737 16.3890873,15.3890873 16.9748737,14.8033009 17.9246212,14.8033009 18.5104076,15.3890873L20.631728,17.5104076C21.2175144,18.0961941,21.2175144,19.0459415,20.631728,19.631728z"/>
 3     <Path x:Name="Part2" Opacity="0.28" Fill="{Binding ForegroundBrush}" Data="M12.5,23C11.6715729,23,11,22.3284271,11,21.5L11,18.5C11,17.6715729 11.6715729,17 12.5,17 13.3284271,17 14,17.6715729 14,18.5L14,21.5C14,22.3284271,13.3284271,23,12.5,23z"/>
 4     <Path x:Name="Part3" Opacity="0.40" Fill="{Binding ForegroundBrush}" Data="M4.36827202,19.631728C3.78248558,19.0459415,3.78248558,18.0961941,4.36827202,17.5104076L6.48959236,15.3890873C7.0753788,14.8033009 8.02512627,14.8033009 8.6109127,15.3890873 9.19669914,15.9748737 9.19669914,16.9246212 8.6109127,17.5104076L6.48959236,19.631728C5.90380592,20.2175144,4.95405845,20.2175144,4.36827202,19.631728z"/>
 5     <Path x:Name="Part4" Opacity="0.52" Fill="{Binding ForegroundBrush}" Data="M1,11.5C1,10.6715729,1.67157288,10,2.5,10L5.5,10C6.32842712,10 7,10.6715729 7,11.5 7,12.3284271 6.32842712,13 5.5,13L2.5,13C1.67157288,13,1,12.3284271,1,11.5z"/>
 6     <Path x:Name="Part5" Opacity="0.64" Fill="{Binding ForegroundBrush}" Data="M4.36827202,3.36827202C4.95405845,2.78248558,5.90380592,2.78248558,6.48959236,3.36827202L8.6109127,5.48959236C9.19669914,6.0753788 9.19669914,7.02512627 8.6109127,7.6109127 8.02512627,8.19669914 7.0753788,8.19669914 6.48959236,7.6109127L4.36827202,5.48959236C3.78248558,4.90380592,3.78248558,3.95405845,4.36827202,3.36827202z"/>
 7     <Path x:Name="Part6" Opacity="0.76" Fill="{Binding ForegroundBrush}" Data="M12.5,0C13.3284271,-1.52179594E-16,14,0.671572875,14,1.5L14,4.5C14,5.32842712 13.3284271,6 12.5,6 11.6715729,6 11,5.32842712 11,4.5L11,1.5C11,0.671572875,11.6715729,1.52179594E-16,12.5,0z"/>
 8     <Path x:Name="Part7" Opacity="0.88" Fill="{Binding ForegroundBrush}" Data="M20.631728,3.36827202C21.2175144,3.95405845,21.2175144,4.90380592,20.631728,5.48959236L18.5104076,7.6109127C17.9246212,8.19669914 16.9748737,8.19669914 16.3890873,7.6109127 15.8033009,7.02512627 15.8033009,6.0753788 16.3890873,5.48959236L18.5104076,3.36827202C19.0961941,2.78248558,20.0459415,2.78248558,20.631728,3.36827202z"/>
 9     <Path x:Name="Part8" Opacity="1.00" Fill="{Binding ForegroundBrush}" Data="M24,11.5C24,12.3284271,23.3284271,13,22.5,13L19.5,13C18.6715729,13 18,12.3284271 18,11.5 18,10.6715729 18.6715729,10 19.5,10L22.5,10C23.3284271,10,24,10.6715729,24,11.5z"/>
10 </Grid>
  • 透明度:将8个按顺时针排序的Path添加Geometry Data,不透明度由小到大设置。
  • 填充色:可在cs文件中添加依赖属性ForegroundBrush,构造函数中设置DataContent=this,然后Path直接绑定此依赖属性ForegroundBrush值即可。

添加绕圈动画

1. 设置一个主动改变透明度的动画静态资源Storyboard.Circle。间隔时间,如0.8秒内,8个path均循环改变其的透明度,从而达到绕圈的效果

  1         <Storyboard x:Key="Storyboard.Circle" RepeatBehavior="Forever">
  2             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Part1" Storyboard.TargetProperty="Opacity">
  3                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.16"/>
  4                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="1.00"/>
  5                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1.00"/>
  6                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.88"/>
  7                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.88"/>
  8                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.76"/>
  9                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.76"/>
 10                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.64"/>
 11                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.64"/>
 12                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.52"/>
 13                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.52"/>
 14                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.40"/>
 15                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.40"/>
 16                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.28"/>
 17                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.28"/>
 18                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.16"/>
 19             </DoubleAnimationUsingKeyFrames>
 20             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Part2" Storyboard.TargetProperty="Opacity">
 21                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.28"/>
 22                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.16"/>
 23                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.16"/>
 24                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1.00"/>
 25                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1.00"/>
 26                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.88"/>
 27                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.88"/>
 28                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.76"/>
 29                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.76"/>
 30                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.64"/>
 31                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.64"/>
 32                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.52"/>
 33                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.52"/>
 34                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.40"/>
 35                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.40"/>
 36                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.28"/>
 37             </DoubleAnimationUsingKeyFrames>
 38             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Part3" Storyboard.TargetProperty="Opacity">
 39                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.40"/>
 40                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.28"/>
 41                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.28"/>
 42                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.16"/>
 43                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.16"/>
 44                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1.00"/>
 45                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.00"/>
 46                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.88"/>
 47                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.88"/>
 48                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.76"/>
 49                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.76"/>
 50                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.64"/>
 51                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.64"/>
 52                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.52"/>
 53                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.52"/>
 54                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.40"/>
 55             </DoubleAnimationUsingKeyFrames>
 56             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Part4" Storyboard.TargetProperty="Opacity">
 57                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.52"/>
 58                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.40"/>
 59                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.40"/>
 60                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.28"/>
 61                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.28"/>
 62                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.16"/>
 63                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.16"/>
 64                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.00"/>
 65                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1.00"/>
 66                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.88"/>
 67                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.88"/>
 68                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.76"/>
 69                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.76"/>
 70                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.64"/>
 71                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.64"/>
 72                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.52"/>
 73             </DoubleAnimationUsingKeyFrames>
 74             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Part5" Storyboard.TargetProperty="Opacity">
 75                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.64"/>
 76                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.52"/>
 77                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.52"/>
 78                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.40"/>
 79                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.40"/>
 80                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.28"/>
 81                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.28"/>
 82                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.16"/>
 83                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.16"/>
 84                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1.00"/>
 85                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="1.00"/>
 86                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.88"/>
 87                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.88"/>
 88                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.76"/>
 89                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.76"/>
 90                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.64"/>
 91             </DoubleAnimationUsingKeyFrames>
 92             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Part6" Storyboard.TargetProperty="Opacity">
 93                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.76"/>
 94                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.64"/>
 95                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.64"/>
 96                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.52"/>
 97                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.52"/>
 98                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.40"/>
 99                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.40"/>
100                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.28"/>
101                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.28"/>
102                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.16"/>
103                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0.16"/>
104                 <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="1.00"/>
105                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="1.00"/>
106                 <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0.88"/>
107                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.88"/>
108                 <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0.76"/>
109             </DoubleAnimationUsingKeyFrames>
110             <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Part7" Storyboard.TargetProperty="Opacity">
111                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.88"/>
112                 <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0.76"/>
113                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.76"/>
114                 <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.64"/>
115                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.64"/>
116                 <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.52"/>
117                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.52"/>
118                 <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0.40"/>
119                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.40"/>
120                 <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.28"/>
121                 <EasingDoubleKeyFrame WPF 绕圈进度条

WPF 客户端浏览器 添加Loading加载进度

[WPF] 使用三种方式实现弧形进度条

wpf 水波进度条 用户控件

WPF实现环(圆)形进度条

活动到片段方法调用带有进度条的线程