Exemple #1
0
        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();
        }