internal static void CreateAlineSeries(DataSeries series, Double width, Double height, Canvas labelCanvas, Canvas chartsCanvas, Boolean animationEnabled) { Canvas line2dCanvas; Canvas line2dLabelCanvas; // Removing exising line chart for a series if(series.Faces != null) { line2dCanvas = series.Faces.Visual as Canvas; line2dLabelCanvas = series.Faces.LabelCanvas; if (line2dCanvas != null) { Panel parent = line2dCanvas.Parent as Panel; if (parent != null) parent.Children.Remove(line2dCanvas); } if (line2dLabelCanvas != null) { Panel parent = line2dLabelCanvas.Parent as Panel; if (parent != null) parent.Children.Remove(line2dLabelCanvas); } } if ((Boolean)series.Enabled == false) { return; } Double xPosition, yPosition; Chart chart = (series.Chart as Chart); line2dLabelCanvas = new Canvas() { Width = width, Height = height }; // Canvas for placing labels List<List<DataPoint>> pointCollectionList = new List<List<DataPoint>>(); List<List<DataPoint>> shadowPointCollectionList = new List<List<DataPoint>>(); PlotGroup plotGroup = series.PlotGroup; LineChartShapeParams lineParams = new LineChartShapeParams(); #region Set LineParms lineParams.Points = new List<DataPoint>(); lineParams.ShadowPoints = new List<DataPoint>(); lineParams.LineGeometryGroup = new GeometryGroup(); lineParams.LineThickness = (Double)series.LineThickness; lineParams.LineColor = series.Color; lineParams.LineStyle = ExtendedGraphics.GetDashArray(series.LineStyle); lineParams.Lighting = (Boolean)series.LightingEnabled; lineParams.ShadowEnabled = (Boolean)series.ShadowEnabled && !(series.RenderAs == RenderAs.QuickLine); lineParams.Opacity = series.Opacity; if ((Boolean)lineParams.ShadowEnabled) lineParams.LineShadowGeometryGroup = new GeometryGroup(); #endregion series.VisualParams = lineParams; Point variableStartPoint = new Point(), endPoint = new Point(); Boolean IsStartPoint = true; // Polyline polyline, PolylineShadow; // Canvas line2dCanvas = new Canvas(); // Canvas lineCanvas; List<DataPoint> viewPortDataPoints = RenderHelper.GetDataPointsUnderViewPort(series, false); foreach (DataPoint dataPoint in viewPortDataPoints) { if (dataPoint.Enabled == false) continue; dataPoint.Marker = null; dataPoint.LabelVisual = null; dataPoint.Faces = null; if (Double.IsNaN(dataPoint.InternalYValue)) { xPosition = Double.NaN; yPosition = Double.NaN; IsStartPoint = true; } else { //CreateMarkerAForLineDataPoint(dataPoint, width, height, ref line2dLabelCanvas, out xPosition, out yPosition); CalculateMarkerPosition(dataPoint, width, height, out xPosition, out yPosition); #region Generate GeometryGroup for line and line shadow if (IsStartPoint) { variableStartPoint = new Point(xPosition, yPosition); IsStartPoint = !IsStartPoint; if (lineParams.Points.Count > 0) { pointCollectionList.Add(lineParams.Points); shadowPointCollectionList.Add(lineParams.ShadowPoints); } lineParams.Points = new List<DataPoint>(); lineParams.ShadowPoints = new List<DataPoint>(); } else { endPoint = new Point(xPosition, yPosition); variableStartPoint = endPoint; IsStartPoint = false; } #endregion Generate GeometryGroup for line and line shadow dataPoint._visualPosition = new Point(xPosition, yPosition); lineParams.Points.Add(dataPoint); if (lineParams.ShadowEnabled) lineParams.ShadowPoints.Add(dataPoint); } if (dataPoint.Parent != null && dataPoint.Parent.RenderAs == RenderAs.QuickLine) dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); } pointCollectionList.Add(lineParams.Points); shadowPointCollectionList.Add(lineParams.ShadowPoints); series.Faces = new Faces(); Path polyline, PolylineShadow; line2dCanvas = GetLine2D(series, width, height, line2dLabelCanvas, lineParams, out polyline, out PolylineShadow, pointCollectionList, shadowPointCollectionList); line2dCanvas.Width = width; line2dCanvas.Height = height; series.Faces.Parts.Add(polyline); if (!VisifireControl.IsMediaEffectsEnabled) series.Faces.Parts.Add(PolylineShadow); labelCanvas.Children.Add(line2dLabelCanvas); chartsCanvas.Children.Add(line2dCanvas); series.Faces.Visual = line2dCanvas; series.Faces.LabelCanvas = line2dLabelCanvas; // Apply animation if (animationEnabled) { if (series.Storyboard == null) series.Storyboard = new Storyboard(); else series.Storyboard.Stop(); // Apply animation to the lines series.Storyboard = ApplyLineChartAnimation(series, line2dCanvas, series.Storyboard, true); } // Create Moving Marker //if (series.MovingMarkerEnabled) { Double movingMarkerSize = (Double)series.MarkerSize * (Double)series.MarkerScale * MOVING_MARKER_SCALE; if (movingMarkerSize < 6) movingMarkerSize = 6; Ellipse movingMarker = new Ellipse() { Visibility = Visibility.Collapsed, IsHitTestVisible = false, Height = movingMarkerSize, Width = movingMarkerSize, Fill = lineParams.LineColor }; labelCanvas.Children.Add(movingMarker); series._movingMarker = movingMarker; } //else //series._movingMarker = null; }
/// <summary> /// Create line in 2D and place inside a canvas /// </summary> /// <param name="lineParams">Line parameters</param> /// <param name="line">line path reference</param> /// <param name="lineShadow">line shadow path reference</param> /// <returns>Canvas</returns> private static Canvas GetLine2D(DataSeries tagReference, Double width, Double height, Canvas line2dLabelCanvas, LineChartShapeParams lineParams, out Path line, out Path lineShadow, List<List<DataPoint>> pointCollectionList, List<List<DataPoint>> shadowPointCollectionList) { Canvas visual = new Canvas(); line = new Path() { Tag = new ElementData() { Element = tagReference } }; line.StrokeLineJoin = PenLineJoin.Round; line.StrokeStartLineCap = PenLineCap.Round; line.StrokeEndLineCap = PenLineCap.Round; line.Stroke = lineParams.Lighting ? Graphics.GetLightingEnabledBrush(lineParams.LineColor, "Linear", new Double[] { 0.65, 0.55 }) : lineParams.LineColor; line.StrokeThickness = lineParams.LineThickness; line.StrokeDashArray = lineParams.LineStyle; line.Opacity = lineParams.Opacity; line.Data = GetPathGeometry(tagReference.RenderAs, null, pointCollectionList, false, width, height, line2dLabelCanvas); if (lineParams.ShadowEnabled) { if (!VisifireControl.IsMediaEffectsEnabled) { lineShadow = new Path() { IsHitTestVisible = false }; lineShadow.Stroke = Graphics.GetLightingEnabledBrush(new SolidColorBrush(Colors.LightGray), "Linear", new Double[] { 0.65, 0.55 }); lineShadow.StrokeStartLineCap = PenLineCap.Round; lineShadow.StrokeEndLineCap = PenLineCap.Round; lineShadow.StrokeLineJoin = PenLineJoin.Round; lineShadow.StrokeThickness = lineParams.LineThickness; lineShadow.Opacity = 0.5; if (lineParams.ShadowEnabled) lineShadow.Data = GetPathGeometry(tagReference.RenderAs, null, shadowPointCollectionList, true, width, height, null); TranslateTransform tt = new TranslateTransform() { X = 2, Y = 2 }; lineShadow.RenderTransform = tt; visual.Children.Add(lineShadow); } else { #if !WP visual.Effect = ExtendedGraphics.GetShadowEffect(315, 2.5, 1); #endif lineShadow = null; } } else lineShadow = null; visual.Children.Add(line); return visual; }