Beispiel #1
0
        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);
        }