c# 实现圆形的进度条(ProgressBar)
这篇文章主要介绍了c# 如何实现圆形的进度条(ProgressBar),帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下在我们实际的工作中可能经常使用到圆形的进度条,但是这c#教程是怎么实现的呢?其实这只不过是修改了一下ProgressBar的模板,我们在下面的代码中我们将ProgressBar的Value值绑定到Border的Background上面,并且使用了一个ValueToProcessConverter的转换器进行相应地转换,这里重点介绍一下这个转换器
<ProgressBar Name="pb" Minimum="0" Maximum="100" ><ProgressBar.Template><ControlTemplate TargetType="ProgressBar"><Border Background="{TemplateBinding Value, Converter={StaticResource ValueToProcessConverter}, ConverterParameter=250}"/></ControlTemplate></ProgressBar.Template>
</ProgressBar>
下面介绍这部分的源码,并做简要的分析:
首先,获取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();}/// <summary>/// 根据角度获取坐标/// </summary>/// <param name="CenterPoint"></param>/// <param name="r"></param>/// <param name="angel"></param>/// <returns></returns>private Point GetPointByAngel(Point CenterPoint, double r, double angel){Point p = new Point();p.X = Math.Sin(angel * Math.PI / 180) * r + CenterPoint.X;p.Y = CenterPoint.Y - Math.Cos(angel * Math.PI / 180) * r;return p;}/// <summary>/// 根据4个坐标画出扇形/// </summary>/// <param name="bigFirstPoint"></param>/// <param name="bigSecondPoint"></param>/// <param name="smallFirstPoint"></param>/// <param name="smallSecondPoint"></param>/// <param name="bigRadius"></param>/// <param name="smallRadius"></param>/// <param name="isLargeArc"></param>/// <returns></returns>private Geometry DrawingArcGeometry(Point bigFirstPoint, Point bigSecondPoint, Point smallFirstPoint, Point smallSecondPoint, double bigRadius, double smallRadius, bool isLargeArc){PathFigure pathFigure = new PathFigure { IsClosed = true };pathFigure.StartPoint = bigFirstPoint;pathFigure.Segments.Add(new ArcSegment{Point = bigSecondPoint,IsLargeArc = isLargeArc,Size = new Size(bigRadius, bigRadius),SweepDirection = SweepDirection.Clockwise});pathFigure.Segments.Add(new LineSegment { Point = smallSecondPoint });pathFigure.Segments.Add(new ArcSegment{Point = smallFirstPoint,IsLargeArc = isLargeArc,Size = new Size(smallRadius, smallRadius),SweepDirection = SweepDirection.Counterclockwise});PathGeometry pathGeometry = new PathGeometry();pathGeometry.Figures.Add(pathFigure);return pathGeometry;}/// <summary>/// 根据当前值和最大值获取扇形/// </summary>/// <param name="value"></param>/// <param name="maxValue"></param>/// <returns></returns>private Geometry GetGeometry(double value, double maxValue, double radiusX, double radiusY, double thickness){bool isLargeArc = false;double percent = value / maxValue;percentString = string.Format("{0}%", Math.Round(percent * 100, 2));double angel = percent * 360D;if (angel > 180) isLargeArc = true;double bigR = radiusX + thickness / 2;double smallR = radiusX - thickness / 2;Point firstpoint = GetPointByAngel(centerPoint, bigR, 0);Point secondpoint = GetPointByAngel(centerPoint, bigR, angel);Point thirdpoint = GetPointByAngel(centerPoint, smallR, 0);Point fourpoint = GetPointByAngel(centerPoint, smallR, angel);return DrawingArcGeometry(firstpoint, secondpoint, thirdpoint, fourpoint, bigR, smallR, isLargeArc);}/// <summary>/// 画扇形/// </summary>/// <param name="drawingContext"></param>/// <param name="value"></param>/// <param name="maxValue"></param>/// <param name="radiusX"></param>/// <param name="radiusY"></param>/// <param name="thickness"></param>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();}/// <summary>/// 根据当前值和最大值画出进度条/// </summary>/// <param name="value"></param>/// <param name="maxValue"></param>/// <returns></returns>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;}}
以上就是c# 实现圆形的进度条(ProgressBar)的详细内容
c# 实现圆形的进度条(ProgressBar)相关推荐
- 【鸿蒙 HarmonyOS】UI 组件 ( 进度条 ProgressBar 和 RoundProgressBar 组件 )
文章目录 一.布局中设置 ProgressBar.RoundProgressBar 进度条 二.代码中设置 ProgressBar.RoundProgressBar 进度条 三.完整代码示例 四.Gi ...
- Android 各种自定义进度条Progressbar
Android 自定义进度条 Progressbar 控件集合 关于我,欢迎关注 博客:ccapton(http://blog.csdn.net/ccapton) 微信:Ccapton Github ...
- vue 圆形百分比进度条_快速构建一个圆形的进度条
在一些特别生的网站上,用户需要一个可视化的是示,以表明网站资源仍然在加载.从Spinner到Skeleton屏幕有不同的方法来解决这类的用户体验效果. 如果我们使用的是开箱即用的解决方案,它为我们提供 ...
- Xamarin XAML语言教程构建进度条ProgressBar
Xamarin XAML语言教程构建进度条ProgressBar Xamarin XAML语言教程构建进度条ProgressBar,ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度 ...
- 在DrawingVisual上绘制圆形的进度条,类似于IOS系统风格。
1.说明:在WPF中,文件下载时需要显示下载进度,由于系统自带的条型进度条比较占用空间,改用圆形的进度条,需要在DrawingVisual上呈现. 运行的效果如图: private Point Get ...
- Windows Phone 7开发,进度条ProgressBar使用详解
进度条在应用中的作用非常大,可以告诉用户当前操作执行的进度,以免用户在等待中失去耐心,进而关闭应 用.Windows Phone 7的进度条有两种样式,一种是从左往右循环滚动的小点点,这种进度条并不能 ...
- JS框架_(Progress.js)圆形动画进度条
百度云盘 传送门 密码: 6mcf 圆形动画进度条效果: <!DOCTYPE html> <html lang="en"> <head>< ...
- 圆形百分比进度条效果
一.前言 最近有点懈怠啊,没怎么整理发布博客.今天写篇文章和大家分享一个常用的效果,圆形百分比进度条.前段时间我有个页面需要该效果,就在网上看了下,实现方式有好几种,我找了一种比较好实现的给大家一步步 ...
- WPF的进度条progressbar,运行时间elapse time和等待spinner的实现
今天用.NET 4.5中的TPL的特性做了个小例子,实现了WPF的进度条progressbar,运行时间elapse time和等待spinner. 先上图吧. 这个例子包含4个实现,分别是同步版本( ...
- PHP进度条 小程序,用微信小程序实现一个圆形的进度条
随着小程序的热度下降,更多的人已经开始静下心来开发微信小程序了,最近在开发一款微信小程序的过程中遇到了一个问题:如何用微信小程序实现一个圆形的进度条?整理一番后,记录下来与大家共享. 代码实现的思路原 ...
最新文章
- 2022-2028年中国无溶剂聚氨酯复膜胶行业市场调查研究及发展前景规划报告
- 今天新开通cnblogs,就说几句,留作纪念。
- 139.00.007 Git学习-Cheat Sheet
- linux开发亿连手机互联,亿连手机互联车载版下载-亿连手机互联车机版v6.6.1 安卓版-腾牛安卓网...
- MVC与三层架构区别
- 二叉树遍历的非递归方法
- MYSQL第一章 创建表 修改表名 删除字段 添加字段 修改地段名
- 魔术方法 :__callStatic( )实例详解
- 莫烦python学习笔记1
- 【新手必看】C语言开发环境,请查收!
- VRay Next(4.0) for SketchUp之BIG分析图制作教程
- 国内有哪些不错的CV(计算机视觉)团队?
- 鸡兔同笼头吃20脚56c语言,鸡兔同笼问题练习题答案.doc
- Burg法求解AR(p)模型参数(三)Levinson递推公式
- 白云机场查获具有充电宝功能的时尚女包
- VS2017编译WRL的Callback模版函数兼容性问题及解决方法
- 软考系统架构师-计算机组成和体系结构
- Google Protobuf 实践使用开发
- 最小二乘法的原理与计算
- “软件宝宝”的安全成长史