protected override Size ArrangeOverride(Size finalSize) { double numChildren = this.Children.Count; if (numChildren > 0) { double totalScale = 0.0; for (int i = 0; i < numChildren; i++) { var child = this.Children[i]; totalScale += UniformWidthPanel.GetScale(child); } double accumulatedScale = 0.0; var newLeft = 0; for (int i = 0; i < numChildren; i++) { var child = this.Children[i]; accumulatedScale += UniformWidthPanel.GetScale(child); //var newRight = (int)Math.Round(finalSize.Width / numChildren * (i + 1)); var newRight = (int)Math.Round(finalSize.Width * accumulatedScale / totalScale); var newWidth = newRight - newLeft; Rect childRect = new Rect(newLeft, 0, newWidth, finalSize.Height); child.Arrange(childRect); newLeft += newWidth; } return(finalSize); } else { return(new Size()); } }
protected override Size MeasureOverride(Size availableSize) { Size newSize = new Size(); if (double.IsInfinity(availableSize.Width) == false) { newSize.Width = availableSize.Width; } if (double.IsInfinity(availableSize.Height) == false) { newSize.Height = availableSize.Height; } double NumChildren = this.Children.Count; if (NumChildren > 0) { double totalScale = 0.0; for (int i = 0; i < NumChildren; i++) { var child = this.Children[i]; totalScale += UniformWidthPanel.GetScale(child); } //Size childSize = availableSize; //childSize.Width /= NumChildren; for (int i = 0; i < NumChildren; i++) { var child = this.Children[i]; Size scaledChildSize = availableSize; var childScale = UniformWidthPanel.GetScale(child); scaledChildSize.Width *= childScale / totalScale; child.Measure(scaledChildSize); if (child.DesiredSize.Height > newSize.Height) { newSize.Height = child.DesiredSize.Height; } } } return(newSize); }