private static IList <ChartSerie> Convert(IEnumerable source, string serieName, string serieValue, string pointName, string pointValue) { try { var result = new List <ChartSerie>(); var serieType = source.GetType().GenericTypeArguments[0]; foreach (var item in source) { var serie = new ChartSerie { Name = serieType.GetProperty(serieName).GetValue(item) as string, Values = new List <DataPoint>() }; if (source.Cast <object>().Count() > 1 && //more than single serie - name is required (string.IsNullOrEmpty(serie.Name) || result.Any(d => d.Name == serie.Name))) { continue; } var points = serieType.GetProperty(serieValue).GetValue(item) as IEnumerable; if (points == null) { continue; } var pointType = points.GetType().GenericTypeArguments[0]; foreach (var p in points) { var dataPoint = new DataPoint { Name = pointType.GetProperty(pointName).GetValue(p) as string, Value = System.Convert.ToDouble(pointType.GetProperty(pointValue).GetValue(p)) }; if (string.IsNullOrEmpty(dataPoint.Name)) { continue; } serie.Values.Add(dataPoint); } result.Add(serie); } return(result); } catch { return(new List <ChartSerie>()); } }
private string CreatePath(ChartSerie serie, double maxItemsCount) { var builder = new StringBuilder(); if (maxItemsCount == 0) { maxItemsCount = 1; } for (var i = 0; i < serie.Values.Count; i++) { var x = (i * ChartArea.ActualWidth) / maxItemsCount; var y = (ChartArea.ActualHeight * (1 - serie.Values[i].Value / MaximalValue.Value)); builder.AppendFormat(i == 0 ? " M {0:0.00} {1:0.00} " : " L {0:0.00} {1:0.00} ", x, y); } if (ChartType == ChartType.Area) { builder.AppendFormat("V {0:0.00} H {1:0.00} Z", ChartArea.ActualHeight, (1 / MaximalValue.Value)); } return(builder.ToString().Replace(",", ".")); }
private IEnumerable <Ellipse> CreateDataPoints(ChartSerie serie, Brush serieBrush, double maxItemsCount) { var list = new List <Ellipse>(); for (var i = 0; i < serie.Values.Count; i++) { var x = (i * ChartArea.ActualWidth) / maxItemsCount; var y = (ChartArea.ActualHeight * (1 - serie.Values[i].Value / MaximalValue.Value)); list.Add(new Ellipse { Width = EllipseWidth, Height = EllipseWidth, Fill = serieBrush, Margin = new Thickness(x - Radious, y - Radious, (ChartArea.ActualWidth - x - Radious), (ChartArea.ActualHeight - y - Radious)), ToolTip = Converter != null ? Converter.Convert(new object[] { serie.Values[i].Name, serie.Values[i].Value }, null, null, null) as string : string.Format(DataPointStringFormat, serie.Values[i].Name, serie.Values[i].Value), Opacity = 1 }); } return(list); }
private void AddBackgroundSerie(int maxCount) { var serie = new ChartSerie { Name = "__bck", Values = new List <DataPoint> { new DataPoint { Value = MinimalValue.Value }, new DataPoint { Value = MaximalValue.Value } } }; var path = CreatePath(serie, maxCount); ChartArea.Children.Add(new Path { Data = Geometry.Parse(path), Stroke = Brushes.Transparent, VerticalAlignment = VerticalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch, Visibility = Visibility.Visible }); }