c# 实现圆形的进度条(ProgressBar)
在我们实际的工作中可能经常使用到圆形的进度条,但是这是怎么实现的呢?其实这只不过是修改了一下ProgressBar的模板,我们在下面的代码中我们将ProgressBar的Value值绑定到Border的Background上面,并且使用了一个ValueToProcessConverter的转换器进行相应地转换,这里重点介绍一下这个转换器
下面介绍这部分的源码,并做简要的分析:
首先,获取ProgressBar.Value,然后再获取ConverterParameter=250这个值,通过这两个值就能确定画的圆环的大小和ProgressBar显示的值,然后我们再调用DrawBrush(arg,100,radius,radius,Thickness)这个函数来进行绘制,具体代码如下:
privateBrushDrawBrush(doublevalue,doublemaxValue,doubleradiusX,doubleradiusY,doublethickness) { DrawingGroupdrawingGroup=newDrawingGroup(); DrawingContextdrawingContext=drawingGroup.Open(); DrawingGeometry(drawingContext,value,maxValue,radiusX,radiusY,thickness); DrawingBrushbrush=newDrawingBrush(drawingGroup); returnbrush; }
这里需要注意的是绝不能直接实例化 DrawingContext;但可以通过某些方法(例如 DrawingGroup.Open 和 DrawingVisual.RenderOpen)获取绘图上下文。我们这里是使用DrawingGroup.Open的方法来进行相应的绘图,然后在里面调用里DrawingGeometry这个函数,在这个函数中开始绘制一些DrawEllipse和DrawGeometry,在这个函数中我们讲解一下FormattedText这个类,使用 FormattedText 对象可以绘制多行文本,且可以单独对该文本中的每个字符设置格式。
privatevoidDrawingGeometry(DrawingContextdrawingContext,doublevalue,doublemaxValue,doubleradiusX,doubleradiusY,doublethickness) { drawingContext.DrawEllipse(null,newPen(EllipseBrush,thickness),centerPoint,radiusX,radiusY); drawingContext.DrawGeometry(NormalBrush,newPen(),GetGeometry(value,maxValue,radiusX,radiusY,thickness)); FormattedTextformatWords=newFormattedText(percentString,CultureInfo.CurrentCulture,FlowDirection.LeftToRight,SuccessRateTypeface,SuccessRateFontSize,NormalBrush); PointstartPoint=newPoint(centerPoint.X-formatWords.Width/2,centerPoint.Y-formatWords.Height/2-SuccessRateFontCorrectionValue); drawingContext.DrawText(formatWords,startPoint); drawingContext.Close(); }
publicclassValueToProcessConverter:IValueConverter { readonlydoubleThickness=20; privatePointcenterPoint; privatedoubleradius; readonlySolidColorBrushNormalBrush=newSolidColorBrush(Colors.White); readonlySolidColorBrushEllipseBrush=newSolidColorBrush(Color.FromRgb(107,132,165)); stringpercentString; privatestaticreadonlyTypefaceSuccessRateTypeface; privateconstintSuccessRateFontSize=65; readonlydoubleSuccessRateFontCorrectionValue=12; staticValueToProcessConverter() { SuccessRateTypeface=newTypeface(newFontFamily("MSYH"),newFontStyle(),newFontWeight(),newFontStretch()); } publicValueToProcessConverter() { } publicobjectConvert(objectvalue,TypetargetType,objectparameter,System.Globalization.CultureInfoculture) { if(valueisdouble&&!string.IsNullOrEmpty((string)parameter)) { doublearg=(double)value; doublewidth=double.Parse((string)parameter); radius=width/2; centerPoint=newPoint(radius,radius); returnDrawBrush(arg,100,radius,radius,Thickness); } else { thrownewArgumentException(); } } publicobjectConvertBack(objectvalue,TypetargetType,objectparameter,System.Globalization.CultureInfoculture) { thrownewNotImplementedException(); } //////根据角度获取坐标 /// ////// /// /// privatePointGetPointByAngel(PointCenterPoint,doubler,doubleangel) { Pointp=newPoint(); p.X=Math.Sin(angel*Math.PI/180)*r+CenterPoint.X; p.Y=CenterPoint.Y-Math.Cos(angel*Math.PI/180)*r; returnp; } /// ///根据4个坐标画出扇形 /// ////// /// /// /// /// /// /// privateGeometryDrawingArcGeometry(PointbigFirstPoint,PointbigSecondPoint,PointsmallFirstPoint,PointsmallSecondPoint,doublebigRadius,doublesmallRadius,boolisLargeArc) { PathFigurepathFigure=newPathFigure{IsClosed=true}; pathFigure.StartPoint=bigFirstPoint; pathFigure.Segments.Add( newArcSegment { Point=bigSecondPoint, IsLargeArc=isLargeArc, Size=newSize(bigRadius,bigRadius), SweepDirection=SweepDirection.Clockwise }); pathFigure.Segments.Add(newLineSegment{Point=smallSecondPoint}); pathFigure.Segments.Add( newArcSegment { Point=smallFirstPoint, IsLargeArc=isLargeArc, Size=newSize(smallRadius,smallRadius), SweepDirection=SweepDirection.Counterclockwise }); PathGeometrypathGeometry=newPathGeometry(); pathGeometry.Figures.Add(pathFigure); returnpathGeometry; } /// ///根据当前值和最大值获取扇形 /// ////// /// privateGeometryGetGeometry(doublevalue,doublemaxValue,doubleradiusX,doubleradiusY,doublethickness) { boolisLargeArc=false; doublepercent=value/maxValue; percentString=string.Format("{0}%",Math.Round(percent*100,2)); doubleangel=percent*360D; if(angel>180)isLargeArc=true; doublebigR=radiusX+thickness/2; doublesmallR=radiusX-thickness/2; Pointfirstpoint=GetPointByAngel(centerPoint,bigR,0); Pointsecondpoint=GetPointByAngel(centerPoint,bigR,angel); Pointthirdpoint=GetPointByAngel(centerPoint,smallR,0); Pointfourpoint=GetPointByAngel(centerPoint,smallR,angel); returnDrawingArcGeometry(firstpoint,secondpoint,thirdpoint,fourpoint,bigR,smallR,isLargeArc); } /// ///画扇形 /// ////// /// /// /// /// privatevoidDrawingGeometry(DrawingContextdrawingContext,doublevalue,doublemaxValue,doubleradiusX,doubleradiusY,doublethickness) { drawingContext.DrawEllipse(null,newPen(EllipseBrush,thickness),centerPoint,radiusX,radiusY); drawingContext.DrawGeometry(NormalBrush,newPen(),GetGeometry(value,maxValue,radiusX,radiusY,thickness)); FormattedTextformatWords=newFormattedText(percentString,CultureInfo.CurrentCulture,FlowDirection.LeftToRight,SuccessRateTypeface,SuccessRateFontSize,NormalBrush); PointstartPoint=newPoint(centerPoint.X-formatWords.Width/2,centerPoint.Y-formatWords.Height/2-SuccessRateFontCorrectionValue); drawingContext.DrawText(formatWords,startPoint); drawingContext.Close(); } /// ///根据当前值和最大值画出进度条 /// ////// /// privateBrushDrawBrush(doublevalue,doublemaxValue,doubleradiusX,doubleradiusY,doublethickness) { DrawingGroupdrawingGroup=newDrawingGroup(); DrawingContextdrawingContext=drawingGroup.Open(); DrawingGeometry(drawingContext,value,maxValue,radiusX,radiusY,thickness); DrawingBrushbrush=newDrawingBrush(drawingGroup); returnbrush; } }
以上就是c#实现圆形的进度条(ProgressBar)的详细内容,更多关于c#实现进度条的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。