private void segmentClicked(object s, RoutedEventArgs e) { var arc = s.RequireType <ArcPath>(); if (!arc.CheckEquality(FocusedSegment.RequireType <ArcPath>())) { FocusedSegment = arc; } //OnSegmentClicked(); }
private void animateAngularOffset() { var angle = FocusedSegment.RequireType <ArcPath>().CalculateAngularOffset(); BeginAnimation(AngleOffsetProperty, new DoubleAnimation(angle, new Duration(TimeSpan.FromMilliseconds(600))) { AccelerationRatio = AnimationParameters.AccelerationRatio, DecelerationRatio = AnimationParameters.DecelerationRatio }); }
protected override void OnRender(DrawingContext drawingContext) { PART_focusedsegmentlabel.Foreground = SecondaryValueForeground.GetMaterial(FallbackMaterialSet); PART_segments.Children.Clear(); var context = new ProviderContext(FilteredData.Count); MaterialProvider.Reset(context); var radius = (PART_segments.RenderSize.Smallest() * CircleScale) / 2; var total = Data.SumValue(); var angleTrace = 0d; var actualRingWidth = radius * RingWidthPercentage; foreach (var d in FilteredData) { var materialSet = MaterialProvider.ProvideNext(context); var degrees = (d.Value / total) * 360; var activePath = new ArcPath(degrees, angleTrace, actualRingWidth, CircleScale, radius, PART_segments.RenderSize, d) { Fill = SegmentForeground.GetMaterial(materialSet), MouseOverFill = materialSet.GetMaterial(Luminosity.P700), DataContext = this }; activePath.Click += segmentClicked; PART_segments.Children.Add(activePath); d.RenderedVisual = activePath; angleTrace += degrees; } if (FocusedSegment == null) { return; } PART_categorylabels.Children.Clear(); var diameter = PART_segments.RenderSize.Smallest() * CircleScale; var outerLabelRadius = (diameter / 2) * OuterLabelPositionScale; var overlayedLabelRadius = (diameter / 2) - (actualRingWidth / 2); var targetAngularOffset = FocusedSegment.RequireType <ArcPath>().CalculateAngularOffset(); MaterialProvider.Reset(context); foreach (var d in FilteredData) { var materialSet = MaterialProvider.ProvideNext(context); var categoryNameLabel = positionLabel(d, outerLabelRadius, targetAngularOffset, true); categoryNameLabel.Content = d.CategoryName; categoryNameLabel.BindTextualPrimitive <BarTotalPrimitive>(this); categoryNameLabel.Foreground = BarTotalForeground.GetMaterial(materialSet); PART_categorylabels.Children.Add(categoryNameLabel); var valueLabel = positionLabel(d, overlayedLabelRadius, targetAngularOffset); valueLabel.Content = d.Value; valueLabel.BindTextualPrimitive <ValuePrimitive>(this); valueLabel.Foreground = ValueForeground.GetMaterial(materialSet); PART_categorylabels.Children.Add(valueLabel); } base.OnRender(drawingContext); }