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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。