private void createPieSegments() { foreach (var item in this.Children) { if (item is PieSegment) { var pieSegment = item as PieSegment; if (pieSegment.DataItem is INotifyPropertyChanged) ((INotifyPropertyChanged)pieSegment.DataItem).PropertyChanged -= PieChartCanvas_PropertyChanged; } } this.Children.Clear(); Items.Clear(); if (ParentPieChartControl.ItemsSource is IEnumerable) { var fillColourProvider = ParentPieChartControl.FillBrushProvider; if (fillColourProvider == null) fillColourProvider = new DefaultBrushProvider(); var items = (IEnumerable)ParentPieChartControl.ItemsSource; Double lastAngle = 0; Double total = 0; foreach (var obj in items) { var value = GetValuePropertyValue(obj); total += Math.Round(value, 2); } var centerPoint = new Point(this.ActualWidth / 2, this.ActualHeight / 2); var outerRadius = ParentPieChartControl.OuterRadius; if (outerRadius == 0) { if (this.ActualWidth > this.ActualHeight) outerRadius = this.ActualHeight / 2; else outerRadius = this.ActualWidth / 2; } var innerRadius = ParentPieChartControl.InnerRadius; int i = 0; foreach (var obj in items) { var value = Math.Round(GetValuePropertyValue(obj), 2); var text = GetDisplayTextPropertyValue(obj); if (value > 0.0) { var percentage = value / total; var angle = percentage * 360; var brush = fillColourProvider.GetBrush(i, value, angle, obj); PieDataItem item = new PieDataItem() { Value = value, Percentage = percentage, Text = text, DataItem = obj, FillBrush = brush }; PieSegment p = new PieSegment() { CenterPoint = centerPoint, Radius = outerRadius, StartAngle = lastAngle, EndAngle = lastAngle + angle, Stroke = ParentPieChartControl.LineBrush, Fill = brush, InnerRadius = innerRadius, StrokeThickness = 0, ExplosionRadius = 15, OffsetRadius = 0, Value = value, Percentage = percentage, DataItem = obj, Text = text }; p.Tapped += pieSegment_Tapped; Items.Add(item); this.Children.Add(p); if (obj is INotifyPropertyChanged) ((INotifyPropertyChanged)obj).PropertyChanged += PieChartCanvas_PropertyChanged; lastAngle += angle; i++; } } } ParentPieChartControl.setLegendItems(Items); }
void raiseItemTappedEvent(PieSegment item) { var tmpEventHandler = ItemTapped; if (tmpEventHandler != null) ItemTapped(this, new ItemTappedEventArgs(item.DataItem)); }