public void Update() { Children.Clear(); xc = Width / 2.0; yc = Height / 2.0; rad = scale * System.Math.Min(Width / 2.5, Height / 2.5); if (eLegend == Legends.LEGEND || eLegend == Legends.LEGEND_PERCENT) { rad *= 0.7; xc -= 0.8 * (xc - rad); } double angle = 0; double x1 = rad, y1 = 0, x2, y2; Size size = new Size(0, 0); Color col = Colors.White; Brush brush; Ellipse ellipse; Rectangle rectangle; TextBlock textblock; for (int i = 0; i < Count; i++) { double frac = startColor + (endColor - startColor) * i / (double)(Count); switch (eHSL) { case HSL.HUE: col = (Color)ColorConverter.ConvertFromString(LDColours.HSLtoRGB(360 * frac, saturation, lightness)); break; case HSL.SATURATION: col = (Color)ColorConverter.ConvertFromString(LDColours.HSLtoRGB(hue, frac, lightness)); break; case HSL.LIGHTNESS: col = (Color)ColorConverter.ConvertFromString(LDColours.HSLtoRGB(hue, saturation, frac)); break; } brush = new SolidColorBrush(col); if (centralColour != "") { GradientBrush gradientBrush = new GradientBrush("", new Primitive("1=" + centralColour + ";2=" + col.ToString() + ";"), ""); brush = gradientBrush.getBrush(); } angle += 2 * System.Math.PI * Values[i] / Total; x2 = rad + rad * System.Math.Sin(angle); y2 = rad - rad * System.Math.Cos(angle); bool bLargeArc = (Values[i] / Total) > 0.5; switch (eStyle) { case Styles.PIE: { PathSegmentCollection pathSegments = new PathSegmentCollection(); pathSegments.Add(new LineSegment(new Point(x1, y1), false)); pathSegments.Add(new ArcSegment(new Point(x2, y2), new Size(rad, rad), angle, bLargeArc, SweepDirection.Clockwise, false)); PathFigureCollection pathFigures = new PathFigureCollection(); pathFigures.Add(new PathFigure(new Point(rad, rad), pathSegments, true)); PathFigureCollection figCollection = new PathFigureCollection(pathFigures); ellipse = new Ellipse { Width = 2 * rad, Height = 2 * rad, Fill = brush }; ellipse.Clip = new PathGeometry(figCollection); ellipse.Tag = new Segment(xc, yc, rad, rad, Name, Labels[i]); ellipse.MouseDown += new MouseButtonEventHandler(_ValueClickedEvent); Children.Add(ellipse); Chart.SetLeft(ellipse, xc - rad); Chart.SetTop(ellipse, yc - rad); } break; case Styles.DOUGHNUT: { PathFigureCollection figCollection; if (bDualDoughnut) { double x1inner = x1 + (1 - LDChart.DoughnutFraction) * (rad - x1); double y1inner = y1 + (1 - LDChart.DoughnutFraction) * (rad - y1); double x2inner = x2 + (1 - LDChart.DoughnutFraction) * (rad - x2); double y2inner = y2 + (1 - LDChart.DoughnutFraction) * (rad - y2); PathSegmentCollection pathSegments = new PathSegmentCollection(); pathSegments.Add(new LineSegment(new Point(x1, y1), false)); pathSegments.Add(new ArcSegment(new Point(x2, y2), new Size(rad, rad), angle, bLargeArc, SweepDirection.Clockwise, false)); pathSegments.Add(new LineSegment(new Point(x2inner, y2inner), false)); pathSegments.Add(new ArcSegment(new Point(x1inner, y1inner), new Size(rad * LDChart.DoughnutFraction, rad * LDChart.DoughnutFraction), angle, bLargeArc, SweepDirection.Counterclockwise, false)); PathFigureCollection pathFigures = new PathFigureCollection(); pathFigures.Add(new PathFigure(new Point(x1inner, y1inner), pathSegments, true)); figCollection = new PathFigureCollection(pathFigures); } else { PathSegmentCollection pathSegments = new PathSegmentCollection(); pathSegments.Add(new LineSegment(new Point(x1, y1), false)); pathSegments.Add(new ArcSegment(new Point(x2, y2), new Size(rad, rad), angle, bLargeArc, SweepDirection.Clockwise, false)); PathFigureCollection pathFigures = new PathFigureCollection(); pathFigures.Add(new PathFigure(new Point(rad, rad), pathSegments, true)); figCollection = new PathFigureCollection(pathFigures); } ellipse = new Ellipse { Width = 2 * rad, Height = 2 * rad, Fill = brush }; ellipse.Clip = new PathGeometry(figCollection); ellipse.Tag = new Segment(xc, yc, rad, rad, Name, Labels[i]); ellipse.MouseDown += new MouseButtonEventHandler(_ValueClickedEvent); Children.Add(ellipse); Chart.SetLeft(ellipse, xc - rad); Chart.SetTop(ellipse, yc - rad); } break; case Styles.BUBBLE: { double sin = System.Math.Sin(System.Math.PI * Values[i] / Total); double r = rad * sin / (1.0 + sin); angle -= System.Math.PI * Values[i] / Total; double x = xc + (rad - r) * System.Math.Sin(angle); double y = yc - (rad - r) * System.Math.Cos(angle); angle += System.Math.PI * Values[i] / Total; ellipse = new Ellipse { Width = 2 * r, Height = 2 * r, Fill = brush }; ellipse.Tag = new Segment(x, y, r, r, Name, Labels[i]); ellipse.MouseDown += new MouseButtonEventHandler(_ValueClickedEvent); Children.Add(ellipse); Chart.SetLeft(ellipse, x - r); Chart.SetTop(ellipse, y - r); } break; case Styles.BAR: { double w = rad * (Values[i] - Min) / (Max - Min); double h = rad / (double)Count; double x = xc - rad + w; double y = yc - rad + (2 * i + 1) * h; rectangle = new Rectangle { Width = 2 * w, Height = 2 * h, Fill = brush }; rectangle.Tag = new Segment(x, y, w, h, Name, Labels[i]); rectangle.MouseDown += new MouseButtonEventHandler(_ValueClickedEvent); Children.Add(rectangle); Chart.SetLeft(rectangle, x - w); Chart.SetTop(rectangle, y - h); } break; case Styles.COLUMN: { double w = rad / (double)Count; double h = rad * (Values[i] - Min) / (Max - Min); double x = xc - rad + (2 * i + 1) * w; double y = yc + rad - h; rectangle = new Rectangle { Width = 2 * w, Height = 2 * h, Fill = brush }; rectangle.Tag = new Segment(x, y, w, h, Name, Labels[i]); rectangle.MouseDown += new MouseButtonEventHandler(_ValueClickedEvent); Children.Add(rectangle); Chart.SetLeft(rectangle, x - w); Chart.SetTop(rectangle, y - h); } break; } brush = new SolidColorBrush(col); x1 = x2; y1 = y2; if (eLegend == Legends.OVERLAY || eLegend == Legends.PERCENT || eLegend == Legends.LEGEND_PERCENT) { textblock = new TextBlock { Text = eLegend == Legends.OVERLAY ? Labels[i] : string.Format("{0:F1}%", 100 * Values[i] / Total), Foreground = foreground, FontFamily = fontFamily, FontSize = fontSize, FontWeight = fontWeight, FontStyle = fontStyle }; if (bLegendBackground) { textblock.Background = brush; } textblock.FontSize *= legendScale; textblock.MouseDown += new MouseButtonEventHandler(_ValueClickedEvent); Children.Add(textblock); textblock.Measure(size); textblock.Arrange(new Rect(size)); angle -= System.Math.PI * Values[i] / Total; double w = textblock.ActualWidth / 2.0; double h = textblock.ActualHeight / 2.0; if (eStyle == Styles.PIE) { x2 = xc + 0.67 * rad * System.Math.Sin(angle); y2 = yc - 0.67 * rad * System.Math.Cos(angle); } else if (eStyle == Styles.DOUGHNUT) { x2 = xc + (1 + LDChart.DoughnutFraction) / 2.0 * rad * System.Math.Sin(angle); y2 = yc - (1 + LDChart.DoughnutFraction) / 2.0 * rad * System.Math.Cos(angle); } else if (eStyle == Styles.BUBBLE) { double sin = System.Math.Sin(System.Math.PI * Values[i] / Total); double r = rad * sin / (1.0 + sin); x2 = xc + (rad - r) * System.Math.Sin(angle); y2 = yc - (rad - r) * System.Math.Cos(angle); } else if (eStyle == Styles.BAR) { //x2 = xc - rad + rad * (Values[i] - Min) / (Max - Min); x2 = xc - rad + w + 5; y2 = yc - rad + (2 * i + 1) * rad / (double)Count; } else if (eStyle == Styles.COLUMN) { x2 = xc - rad + (2 * i + 1) * rad / (double)Count; //y2 = yc + rad - rad * (Values[i] - Min) / (Max - Min); y2 = yc + rad - w - 5; RotateTransform rotateTransform = new RotateTransform(); rotateTransform.CenterX = w; rotateTransform.CenterY = h; rotateTransform.Angle = -90; textblock.RenderTransform = rotateTransform; } angle += System.Math.PI * Values[i] / Total; textblock.Tag = new Segment(x2, y2, w, h, Name, Labels[i]); Chart.SetLeft(textblock, x2 - w); Chart.SetTop(textblock, y2 - h); Canvas.SetZIndex(textblock, 1); } if (eLegend == Legends.LEGEND || eLegend == Legends.LEGEND_PERCENT) { rectangle = new Rectangle { Width = 10 * legendScale, Height = 10 * legendScale, Fill = brush }; Children.Add(rectangle); x2 = 2 * xc; y2 = (Width - 15 * Count * legendScale) / 2 + 15 * i * legendScale; Chart.SetLeft(rectangle, x2); Chart.SetTop(rectangle, y2); Canvas.SetZIndex(rectangle, 1); textblock = new TextBlock { Text = Labels[i], Foreground = foreground, FontFamily = fontFamily, FontSize = fontSize, FontWeight = fontWeight, FontStyle = fontStyle }; if (bLegendBackground) { textblock.Background = brush; } textblock.FontSize *= legendScale; Children.Add(textblock); textblock.Measure(size); textblock.Arrange(new Rect(size)); Chart.SetLeft(textblock, x2 + 15 * legendScale); Chart.SetTop(textblock, y2 + 5 * legendScale - textblock.ActualHeight / 2.0); Canvas.SetZIndex(textblock, 1); } } if (eStyle == Styles.DOUGHNUT && !bDualDoughnut) { ellipse = new Ellipse { Width = 2 * LDChart.DoughnutFraction * rad, Height = 2 * LDChart.DoughnutFraction * rad, Fill = Background }; Children.Add(ellipse); Chart.SetLeft(ellipse, xc - LDChart.DoughnutFraction * rad); Chart.SetTop(ellipse, yc - LDChart.DoughnutFraction * rad); } }