protected override Size ArrangeOverride(Size finalSize) { m_resultDockRect = ChartLayoutUtils.Subtractthickness(new Rect(new Point(0, 0), finalSize), m_controlsThickness); Rect currRect = new Rect(new Point(0, 0), finalSize); Rect resRect = currRect; #region Arrange Central Element if (m_rootElement != null) { try { m_rootElement.Arrange(m_resultDockRect); } catch (Exception) { } } #endregion #region Arrange All Elements double legendTop = -1d; for (int i = 0; i < Children.Count; i++) { FrameworkElement element = Children[i] as FrameworkElement; Size elemSize = ChartLayoutUtils.Addthickness(element.DesiredSize, ElementMargin); double scale; if (element != null && element != m_rootElement) { var chartLegend = element as ChartLegend; var offsetX = 0d; var offsetY = 0d; if (chartLegend != null) { offsetX = double.IsNaN(chartLegend.OffsetX) ? 0d : chartLegend.OffsetX; offsetY = double.IsNaN(chartLegend.OffsetY) ? 0d : chartLegend.OffsetY; } #region Orientation == Orientation.Horizontal switch (GetDock(element)) { case ChartDock.Left: if (element is ChartLegend) { var arrangeRect = (element as ChartLegend).ArrangeRect; ArrangeElement(element, ChartDock.Left, new Rect(arrangeRect.Left + offsetX + currRect.Left, arrangeRect.Top + offsetY + m_controlsThickness.Top, arrangeRect.Width, arrangeRect.Height)); } else { ArrangeElement(element, ChartDock.Left, new Rect(currRect.Left, resRect.Y, elemSize.Width, resRect.Height)); currRect.X += elemSize.Width; scale = currRect.Width - elemSize.Width; currRect.Width = scale > 0 ? scale : 0; } break; case ChartDock.Right: if (element is ChartLegend) { var arrangeRect = (element as ChartLegend).ArrangeRect; ArrangeElement(element, ChartDock.Right, new Rect(arrangeRect.Left + offsetX + m_controlsThickness.Left, arrangeRect.Top + offsetY + m_controlsThickness.Top, arrangeRect.Width, arrangeRect.Height)); } else { scale = currRect.Width - elemSize.Width; currRect.Width = scale > 0 ? scale : 0; ArrangeElement(element, ChartDock.Right, new Rect(currRect.Right, resRect.Top + m_controlsThickness.Top, elemSize.Width, resRect.Height)); } break; case ChartDock.Top: if (element is ChartLegend) { if (legendTop == -1) { legendTop = currRect.Top; } var arrangeRect = (element as ChartLegend).ArrangeRect; ArrangeElement(element, ChartDock.Top, new Rect(arrangeRect.Left + offsetX + m_controlsThickness.Left, arrangeRect.Top + offsetY + legendTop, arrangeRect.Width, arrangeRect.Height)); } else { ArrangeElement(element, ChartDock.Top, new Rect(0, currRect.Top, finalSize.Width, elemSize.Height)); currRect.Y += elemSize.Height; scale = currRect.Height - elemSize.Height; currRect.Height = scale > 0 ? scale : 0; } break; case ChartDock.Bottom: if (element is ChartLegend) { var arrangeRect = (element as ChartLegend).ArrangeRect; ArrangeElement(element, ChartDock.Bottom, new Rect(arrangeRect.Left + offsetX + m_controlsThickness.Left, arrangeRect.Top + offsetY + m_controlsThickness.Top, arrangeRect.Width, arrangeRect.Height)); } else { scale = currRect.Height - elemSize.Height; currRect.Height = scale > 0 ? scale : 0; ArrangeElement(element, ChartDock.Bottom, new Rect(0, currRect.Bottom, finalSize.Width, elemSize.Height)); } break; case ChartDock.Floating: Rect elementRect = new Rect(new Point(0, 0), new Size(element.DesiredSize.Width, element.DesiredSize.Height)); if (chartLegend != null) { element.Arrange(EnsureRectIsInside(resRect, new Rect(chartLegend.ArrangeRect.Left + offsetX + m_controlsThickness.Left, chartLegend.ArrangeRect.Top + offsetY + m_controlsThickness.Top, element.DesiredSize.Width, chartLegend.DesiredSize.Height))); } else { element.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); } break; } #endregion } } #endregion #if Uno #if __ANDROID__ || __IOS__ || __WASM__ return(finalSize); #else return(base.ArrangeOverride(finalSize)); #endif #else return(base.ArrangeOverride(finalSize)); #endif }
/// <summary> /// Provides the behavior for the Measure pass of Silverlight layout. Classes can override this method to define their own Measure pass behavior. /// </summary> /// <returns> /// The size that this object determines it needs during layout, based on its calculations of the allocated sizes for child objects; or based on other considerations, such as a fixed container size. /// </returns> /// <param name="availableSize">The Available Size</param> protected override Size MeasureOverride(Size availableSize) { var topSizes = new List <double>(); var leftSizes = new List <double>(); var bottomSizes = new List <double>(); var rightSizes = new List <double>(); Thickness margin = this.ElementMargin; m_controlsThickness = this.ElementMargin; foreach (UIElement element in Children) { if (element == null) { continue; } if (element == m_rootElement) { continue; } element.Measure(availableSize); Size elemSize = ChartLayoutUtils.Addthickness(element.DesiredSize, margin); var chartLegend = element as ChartLegend; switch (GetDock(element)) { case ChartDock.Left: if (chartLegend != null) { var index = chartLegend.RowColumnIndex; if (leftSizes.Count <= index) { leftSizes.Add(elemSize.Width); } else if (leftSizes[index] < elemSize.Width) { leftSizes[index] = elemSize.Width; } } else { m_controlsThickness.Left += elemSize.Width; } break; case ChartDock.Right: if (chartLegend != null) { var index = chartLegend.RowColumnIndex; if (rightSizes.Count <= index) { rightSizes.Add(elemSize.Width); } else if (rightSizes[index] < elemSize.Width) { rightSizes[index] = elemSize.Width; } } else { m_controlsThickness.Right += elemSize.Width; } break; case ChartDock.Top: if (chartLegend != null) { var index = chartLegend.RowColumnIndex; if (topSizes.Count <= index) { topSizes.Add(elemSize.Height); } else if (topSizes[index] < elemSize.Height) { topSizes[index] = elemSize.Height; } } else { m_controlsThickness.Top += elemSize.Height; } break; case ChartDock.Bottom: if (chartLegend != null) { var index = chartLegend.RowColumnIndex; if (bottomSizes.Count <= index) { bottomSizes.Add(elemSize.Height); } else if (bottomSizes[index] < elemSize.Height) { bottomSizes[index] = elemSize.Height; } } else { m_controlsThickness.Bottom += elemSize.Height; } break; case ChartDock.Floating: // WPF - 33623 Force to measure the dockpanel when set the DockPosition and LegendPosition as Inside. if (chartLegend != null) { if (chartLegend.ActualHeight > 0 || chartLegend.ActualWidth > 0) { leftSizes.Add(0); } else { leftSizes.Add(0.1); } } break; } } m_controlsThickness.Left += leftSizes.Sum(); m_controlsThickness.Right += rightSizes.Sum(); m_controlsThickness.Top += topSizes.Sum(); m_controlsThickness.Bottom += bottomSizes.Sum(); try { var areasize = ChartLayoutUtils.Subtractthickness(availableSize, m_controlsThickness); m_rootElement.Measure(areasize); } catch (Exception) { } return(availableSize); }