效果图
可以自己绘制成圆形等任意形状到Canvas
核心代码部分
绘制部分
//Value:当前进度值
_streamGeometry = GetSinGeometry(this.Width, -5, 1 / 30.0, -this.Width + this.Width * Value / 100, this.Height - this.Height * Value / 100);
GeometryGroup group = new GeometryGroup();
group.Children.Add(_streamGeometry);
Path myPath = new Path
{
Fill = Brushes.DarkGreen,
Data = group
};
//绘制
this.Canvas.Children.Add(myPath);
正弦曲线计算波纹
/// <summary>
/// 正弦曲线计算
/// </summary>
/// <param name="waveWidth">水纹宽度</param>
/// <param name="waveA">水纹振幅</param>
/// <param name="waveW">水纹周期</param>
/// <param name="offsetX">位移</param>
/// <param name="currentK">当前波浪高度</param>
/// <returns></returns>
private StreamGeometry GetSinGeometry(double waveWidth, double waveA, double waveW, double offsetX, double currentK)
{
StreamGeometry g = new StreamGeometry();
using StreamGeometryContext ctx = g.Open();
ctx.BeginFigure(new Point(0, waveWidth), true, true);
for (int x = 0; x < waveWidth; x += 1)
{
double y = waveA * Math.Sin(x * waveW + offsetX) + currentK;
ctx.LineTo(new Point(x, y), true, true);
}
ctx.LineTo(new Point(waveWidth, waveWidth), true, true);
return g;
}