protected override void OnRender(DrawingContext drawingContext) { //base.OnRender(drawingContext); if (AxisPanel == null) { return; } //计算每个点之间的间距是多少 var cellWidth = GetCellInterval(); var xTransform = GetXTransform(cellWidth); _startIndex = GetStartIndex(xTransform); //没有点,或是只有一个都不能画线,在平面中过一点可以画无数条线 if (Datas == null || Datas.Count <= 1 || _startIndex >= Datas.Count) { return; } //实际圆的半径(线宽+半径) //var realRadius = GetRealRadius(); var displayCount = (int)Math.Min(ActualWidth / cellWidth + 2, Datas.Count); //每次动态产生对效能有影响,可以放到Arrange或是赋值之后计算一遍,此为偷懒写法 //或可以说时间换空间? var pointList = new List <Point>(displayCount); for (int i = 0, j = _startIndex; j < Datas.Count && i < displayCount; i++, j++) { var y = GetY(Datas[j]); //if (realRadius == y) // y = 0; //注意横坐标有加realRadius //var x = i * cellWidth + realRadius - Radius; var x = i * cellWidth; var point = new Point(x, y); // orginal : var point = new Point(i * cellWidth + realRadius, y); pointList.Add(point); } drawingContext.PushTransform(new TranslateTransform(xTransform, 0)); //因为没有动画效果,并为了追求更好的效能,所以使用StreamGeometry var geometry = new StreamGeometry(); using (var context = geometry.Open()) { context.BeginFigure(pointList[0], true, false); context.PolyLineTo(pointList, true, true); context.Close(); } geometry.Freeze(); //这些画笔也可以理解为时间换空间 var dashStyle = new DashStyle(LineDashArray, LineDashOffset); dashStyle.Freeze(); #region shadow drawing //Pen shadowPen = new Pen(ShadowColor, LineThickness); //shadowPen.StartLineCap = PenLineCap.Round; //shadowPen.EndLineCap = PenLineCap.Round; //shadowPen.DashStyle = dashStyle; //shadowPen.DashCap = LineDashCap; //shadowPen.Freeze(); //if (IsShowShadow) //{ // //draw offset line shadow // drawingContext.PushTransform(new TranslateTransform(LineThickness * 0.312, -LineThickness * 0.681)); // drawingContext.DrawGeometry(null, shadowPen, geometry); // drawingContext.Pop(); //} #endregion //draw line var linePen = new Pen(LineColor, LineThickness) { DashCap = LineDashCap, DashStyle = dashStyle }; linePen.Freeze(); drawingContext.DrawGeometry(null, linePen, geometry); if (0 < Radius) { var ellipseLinePen = new Pen(LineColor, LineThickness / 2); ellipseLinePen.Freeze(); //draw ellipse foreach (var point in pointList) { drawingContext.DrawEllipse(PointColor, ellipseLinePen, point, Radius, Radius); } } drawingContext.Pop(); }