在我们实际的工作中可能经常使用到圆形的进度条,但是这是怎么实现的呢?其实这只不过是修改了一下ProgressBar的模板,我们在下面的代码中我们将ProgressBar的Value值绑定到Border的Background上面,并且使用了一个ValueToProcessConverter的转换器进行相应地转换,这里重点介绍一下这个转换器下面介绍这部分的源码,并做简要的分析:首先,获取ProgressBar.Value,然后再获取ConverterParameter=250这个值,通过这两个值就能确定画的圆环的大小和ProgressBar显示的值,然后我们再调用DrawBrush(arg, 100, radius, radius, Thickness)这个函数来进行绘制,具体代码如下:private Brush DrawBrush(double value, double maxValue, double radiusX, double radiusY, double thickness){DrawingGroup drawingGroup = new DrawingGroup();DrawingContext drawingContext = drawingGroup.Open();DrawingGeometry(drawingContext, value, maxValue, radiusX, radiusY, thickness);DrawingBrush brush = new DrawingBrush(drawingGroup);return brush;}这里需要注意的是绝不能直接实例化 DrawingContext;但可以通过某些方法(例如 DrawingGroup.Open 和 DrawingVisual.RenderOpen)获取绘图上下文。我们这里是使用DrawingGroup.Open的方法来进行相应的绘图,然后在里面调用里DrawingGeometry这个函数,在这个函数中开始绘制一些DrawEllipse和DrawGeometry,在这个函数中我们讲解一下FormattedText 这个类,使用 FormattedText 对象可以绘制多行文本,且可以单独对该文本中的每个字符设置格式。
private void DrawingGeometry(DrawingContext drawingContext, double value, double maxValue, double radiusX, double radiusY, double thickness){drawingContext.DrawEllipse(null, new Pen(EllipseBrush, thickness), centerPoint, radiusX, radiusY);drawingContext.DrawGeometry(NormalBrush, new Pen(), GetGeometry(value, maxValue, radiusX, radiusY, thickness));
FormattedText formatWords = new FormattedText(percentString, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, SuccessRateTypeface, SuccessRateFontSize, NormalBrush);Point startPoint = new Point(centerPoint.X - formatWords.Width / 2, centerPoint.Y - formatWords.Height / 2 - SuccessRateFontCorrectionValue);drawingContext.DrawText(formatWords, startPoint);
drawingContext.Close();} public class ValueToProcessConverter : IValueConverter{readonly double Thickness = 20;private Point centerPoint;private double radius;readonly SolidColorBrush NormalBrush = new SolidColorBrush(Colors.White);readonly SolidColorBrush EllipseBrush = new SolidColorBrush(Color.FromRgb(107, 132, 165));
string percentString;private static readonly Typeface SuccessRateTypeface;private const int SuccessRateFontSize = 65;readonly double SuccessRateFontCorrectionValue = 12;
static ValueToProcessConverter(){SuccessRateTypeface = new Typeface(new FontFamily("MSYH"), new FontStyle(), new FontWeight(), new FontStretch());}public ValueToProcessConverter(){
}public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){if (value is double && !string.IsNullOrEmpty((string)parameter)){double arg = (double)value;double width = double.Parse((string)parameter);radius = width / 2;centerPoint = new Point(radius, radius);return DrawBrush(arg, 100, radius, radius, Thickness);}else{throw new ArgumentException();}}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}
///
///
return pathGeometry;}
///
///
///
}以上就是c# 实现圆形的进度条(ProgressBar)的详细内容,更多关于c# 实现进度条的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:C#实现炫酷启动图-动态进度条效果C# Oracle批量插入数据进度条的实现代码C#自定义音乐播放器进度条C#实现带百分比的进度条功能示例C#实现带进度条的ListView C# Winform下载文件并显示进度条的实现代码c#根据文件大小显示文件复制进度条实例c#进度条 progressBar 使用方法的小例子C#中常使用进度条的代码Winform 实现进度条弹窗和任务控制C#使用winform实现进度条效果
