protected override void OnRender(DrawingContext drawingContext) { PART_bars.Children.Clear(); PART_xAxisGrid.Children.Clear(); PART_highlightGrid.Children.Clear(); if (FilteredData.Count < 1) { base.OnRender(drawingContext); return; } var total = FilteredData.MaxSubsetSum(); var context = new ProviderContext(FilteredData.Count); var barAvailableWidth = PART_bars.RenderSize.Width / FilteredData.Count; var barActiveWidth = barAvailableWidth * SegmentWidthPercentage; var barLeftSpacing = (barAvailableWidth - barActiveWidth) / 2; var barLabelSize = RenderingExtensions.EstimateLabelRenderSize(BarTotalFontFamily, BarTotalFontSize); var xtrace = 0; foreach (var d in FilteredData) { var axisLabel = new Label { Content = d.CategoryName, IsHitTestVisible = false, HorizontalContentAlignment = HorizontalAlignment.Center, VerticalContentAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Bottom, Width = barAvailableWidth, Margin = new Thickness(barAvailableWidth * xtrace, 0, 0, 0), Foreground = XAxisForeground.GetMaterial(FallbackMaterialSet), DataContext = this }; axisLabel.BindTextualPrimitive <XAxisPrimitive>(this); PART_xAxisGrid.Children.Add(axisLabel); xtrace++; } var horizontalTrace = 0d; var xAxisHeight = PART_xAxisGrid.ActualHeight; var backHeight = PART_bars.RenderSize.Height - xAxisHeight; foreach (var d in FilteredData) { var backRectangle = new Rectangle { Width = barActiveWidth, Height = backHeight, VerticalAlignment = VerticalAlignment.Bottom, HorizontalAlignment = HorizontalAlignment.Left, Margin = new Thickness(horizontalTrace + barLeftSpacing, 0, 0, xAxisHeight), Fill = SegmentSpaceBackground.GetMaterial(FallbackMaterialSet) }; //backRectangle.MouseEnter += (s, e) => barMouseEnter(d); PART_bars.Children.Add(backRectangle); MaterialProvider.Reset(context); var verticalTrace = 0d; var pathBuffer = new List <Shape>(); foreach (var sd in d.Value) { var materialSet = MaterialProvider.ProvideNext(context); var height = sd.Value.Map(0, total, 0, PART_bars.RenderSize.Height - xAxisHeight - barLabelSize.Height); var rectangle = new Rectangle { Width = barActiveWidth, Height = height + verticalTrace, Fill = SegmentForeground.GetMaterial(materialSet), VerticalAlignment = VerticalAlignment.Bottom, HorizontalAlignment = HorizontalAlignment.Left, Margin = new Thickness(horizontalTrace + barLeftSpacing, 0, 0, xAxisHeight), RenderTransform = new ScaleTransform(1, (IsLoaded ? 1 : 0), .5, 1), RenderTransformOrigin = new Point(.5, 1) }; //rectangle.MouseEnter += (s, e) => barMouseEnter(d); //rectangle.MouseLeave += (s, e) => barMouseLeave(s, e, d, sd); //TODO get rid of all isloaded conditional sets sd.RenderedVisual = rectangle; pathBuffer.Add(rectangle); verticalTrace += height; } for (var x = pathBuffer.Count - 1; x >= 0; x--) { var path = pathBuffer[x]; PART_bars.Children.Add(path); } var barLabel = new Label { Content = d.Value.SumValue(), IsHitTestVisible = false, HorizontalContentAlignment = HorizontalAlignment.Center, VerticalContentAlignment = VerticalAlignment.Center, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Bottom, Width = barAvailableWidth, Foreground = BarTotalForeground.GetMaterial(FallbackMaterialSet), Margin = new Thickness(horizontalTrace, 0, 0, xAxisHeight + verticalTrace), }; barLabel.BindTextualPrimitive <BarTotalPrimitive>(this); d.RenderedVisual = pathBuffer; PART_bars.Children.Add(barLabel); horizontalTrace += barAvailableWidth; } base.OnRender(drawingContext); }