精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。
仪表盘控件用于显示有范围限制的数值,最典型的就是汽车上的油表盘,指示油量多少和范围示意,除了汽车,在物联网上也经常使用到仪表盘,最近编写上位机软件,要进行仪表盘开发,对于WPF仪表盘控件进行了研究,下图是定制后的仪表盘界面:
注意上面的内圈弧形有四段。
下面是定制前的仪表盘界面:
注意上面的内圈弧形有三段。
四段比三段能表达更多范围的意思,适用面更广。
WPF仪表盘控件由UI文件和代码文件组成,UI文件是指xaml文件,代码文件是指cs。在xaml里主要由style、Ellipse、Image和Path来组成,而cs文件则对组成部分进行详细的绘制。cs文件里还定义了大量的DependencyProperty属性来支持在使用控件代码里定制控件。下面是绘制内圈弧形段的代码:
private void DrawSegment(Point p1, Point p2, Point p3, Point p4, bool reflexangle, Color clr) { // Segment Geometry PathSegmentCollection segments = new PathSegmentCollection(); // First line segment from pt p1 - pt p2 segments.Add(new LineSegment() { Point = p2 }); //Arc drawn from pt p2 - pt p3 with the RangeIndicatorRadius segments.Add(new ArcSegment() { Size = new Size(arcradius2, arcradius2), Point = p3, SweepDirection = SweepDirection.Clockwise, IsLargeArc = reflexangle }); // Second line segment from pt p3 - pt p4 segments.Add(new LineSegment() { Point = p4 }); //Arc drawn from pt p4 - pt p1 with the Radius of arcradius1 segments.Add(new ArcSegment() { Size = new Size(arcradius1, arcradius1), Point = p1, SweepDirection = SweepDirection.Counterclockwise, IsLargeArc = reflexangle }); // Defining the segment path properties Color rangestrokecolor; if (clr == Colors.Transparent) { rangestrokecolor = clr; } else rangestrokecolor = Colors.White; rangeIndicator = new Path() { StrokeLineJoin = PenLineJoin.Round, Stroke = new SolidColorBrush(rangestrokecolor), //Color.FromArgb(0xFF, 0xF5, 0x9A, 0x86) Fill = new SolidColorBrush(clr), Opacity = 0.65, StrokeThickness = 0.25, Data = new PathGeometry() { Figures = new PathFigureCollection() { new PathFigure() { IsClosed = true, StartPoint = p1, Segments = segments } } } }; //Set Z index of range indicator rangeIndicator.SetValue(Canvas.ZIndexProperty, 150); // Adding the segment to the root grid rootGrid.Children.Add(rangeIndicator); }
这些细节绘制还是很麻烦的,如果个人从头把仪表盘开发出来,需要一定时间,所以做开发的要会使用互联网资源,站在别人肩膀上做开发。
锐英源软件擅长C#和WPF开发,欢迎合作各类项目和技术难题。