protected override Size ArrangeOverride(Size finalSize) { Orientation orientation = this.Orientation; OrientedSize lineSize = new OrientedSize(orientation); OrientedSize maximumSize = new OrientedSize(orientation, finalSize.Width, finalSize.Height); double itemWidth = this.ItemWidth; double itemHeight = this.ItemHeight; bool hasFixedWidth = double.IsNaN(itemWidth) == false; bool hasFixedHeight = double.IsNaN(itemHeight) == false; double indirectOffset = 0.0d; double?directDelta = (orientation == Orientation.Horizontal) ? (hasFixedWidth ? (double?)itemWidth : null) : (hasFixedHeight ? (double?)itemHeight : null); UIElementCollection children = this.Children; int count = children.Count; int lineStart = 0; for (int lineEnd = 0; lineEnd < count; lineEnd++) { UIElement element = children[lineEnd]; OrientedSize elementSize = new OrientedSize(orientation, hasFixedWidth ? itemWidth : element.DesiredSize.Width, hasFixedHeight ? itemHeight : element.DesiredSize.Height); if (lineSize.Direct + elementSize.Direct > maximumSize.Direct) { ArrangeLine(lineStart, lineEnd, directDelta, indirectOffset, lineSize.Indirect); indirectOffset += lineSize.Indirect; lineSize = elementSize; if (elementSize.Direct > maximumSize.Direct) { ArrangeLine(lineEnd, ++lineEnd, directDelta, indirectOffset, elementSize.Indirect); indirectOffset += lineSize.Indirect; lineSize = new OrientedSize(orientation); } lineStart = lineEnd; } else { lineSize.Direct += elementSize.Direct; lineSize.Indirect = Math.Max(lineSize.Indirect, elementSize.Indirect); } } if (lineStart < count) { ArrangeLine(lineStart, count, directDelta, indirectOffset, lineSize.Indirect); } return(finalSize); }
protected override Size ArrangeOverride(Size finalSize) { var orientation = Orientation; var lineSize = new OrientedSize(orientation); var maximumSize = new OrientedSize(orientation, finalSize.Width, finalSize.Height); var itemWidth = ItemWidth; var itemHeight = ItemHeight; var hasFixedWidth = double.IsNaN(itemWidth) == false; var hasFixedHeight = double.IsNaN(itemHeight) == false; var indirectOffset = 0.0d; var directDelta = (orientation == Orientation.Horizontal) ? (hasFixedWidth ? (double?)itemWidth : null) : (hasFixedHeight ? (double?)itemHeight : null); var children = Children; var count = children.Count; var lineStart = 0; for (var lineEnd = 0; lineEnd < count; lineEnd++) { var element = children[lineEnd]; var elementSize = new OrientedSize(orientation, hasFixedWidth ? itemWidth : element.DesiredSize.Width, hasFixedHeight ? itemHeight : element.DesiredSize.Height); if (lineSize.Direct + elementSize.Direct > maximumSize.Direct) { ArrangeLine(lineStart, lineEnd, directDelta, indirectOffset, lineSize.Indirect); indirectOffset += lineSize.Indirect; lineSize = elementSize; if (elementSize.Direct > maximumSize.Direct) { ArrangeLine(lineEnd, ++lineEnd, directDelta, indirectOffset, elementSize.Indirect); indirectOffset += lineSize.Indirect; lineSize = new OrientedSize(orientation); } lineStart = lineEnd; } else { lineSize.Direct += elementSize.Direct; lineSize.Indirect = Math.Max(lineSize.Indirect, elementSize.Indirect); } } if (lineStart < count) { ArrangeLine(lineStart, count, directDelta, indirectOffset, lineSize.Indirect); } return finalSize; }
protected override Size MeasureOverride(Size constraint) { Orientation orientation = this.Orientation; OrientedSize lineSize = new OrientedSize(orientation); OrientedSize totalSize = new OrientedSize(orientation); OrientedSize maximumSize = new OrientedSize(orientation, constraint.Width, constraint.Height); double itemWidth = this.ItemWidth; double itemHeight = this.ItemHeight; bool hasFixedWidth = double.IsNaN(itemWidth) == false; bool hasFixedHeihgt = double.IsNaN(itemHeight) == false; Size itemSize = new Size(hasFixedWidth ? itemWidth : constraint.Width, hasFixedHeihgt ? itemHeight : constraint.Height); foreach (UIElement element in Children) { element.Measure(itemSize); OrientedSize elementSize = new OrientedSize(orientation, hasFixedWidth ? itemWidth : element.DesiredSize.Width, hasFixedHeihgt ? itemHeight : element.DesiredSize.Height); if (lineSize.Direct + elementSize.Direct > maximumSize.Direct) { totalSize.Direct = Math.Max(lineSize.Direct, totalSize.Direct); totalSize.Indirect += lineSize.Indirect; lineSize = elementSize; if (elementSize.Direct > maximumSize.Direct) { totalSize.Direct = Math.Max(elementSize.Direct, totalSize.Direct); totalSize.Indirect += elementSize.Indirect; lineSize = new OrientedSize(orientation); } } else { lineSize.Direct += elementSize.Direct; lineSize.Indirect = Math.Max(lineSize.Indirect, elementSize.Indirect); } } totalSize.Direct = Math.Max(lineSize.Direct, totalSize.Direct); totalSize.Indirect += lineSize.Indirect; return(new Size(totalSize.Width, totalSize.Height)); }
private void ArrangeLine(int lineStart, int lineEnd, double?directDelta, double indirectOffset, double indirectGrowth) { double directOffset = 0.0d; Orientation orientation = this.Orientation; bool isHorizontal = orientation == Orientation.Horizontal; UIElementCollection children = this.Children; for (int index = lineStart; index < lineEnd; index++) { UIElement element = children[index]; OrientedSize elementSize = new OrientedSize(orientation, element.DesiredSize.Width, element.DesiredSize.Height); double directGrowth = directDelta != null ? directDelta.Value : elementSize.Direct; Rect bounds = isHorizontal ? new Rect(directOffset, indirectOffset, directGrowth, indirectGrowth) : new Rect(indirectOffset, directOffset, indirectGrowth, directGrowth); element.Arrange(bounds); directOffset += directGrowth; } }
private void ArrangeLine(int lineStart, int lineEnd, double? directDelta, double indirectOffset, double indirectGrowth) { var directOffset = 0.0d; var orientation = Orientation; var isHorizontal = orientation == Orientation.Horizontal; var children = Children; for (var index = lineStart; index < lineEnd; index++) { var element = children[index]; var elementSize = new OrientedSize(orientation, element.DesiredSize.Width, element.DesiredSize.Height); var directGrowth = directDelta != null ? directDelta.Value : elementSize.Direct; var bounds = isHorizontal ? new Rect(directOffset, indirectOffset, directGrowth, indirectGrowth) : new Rect(indirectOffset, directOffset, indirectGrowth, directGrowth); element.Arrange(bounds); directOffset += directGrowth; } }
protected override Size MeasureOverride(Size constraint) { var orientation = Orientation; var lineSize = new OrientedSize(orientation); var totalSize = new OrientedSize(orientation); var maximumSize = new OrientedSize(orientation, constraint.Width, constraint.Height); var itemWidth = ItemWidth; var itemHeight = ItemHeight; var hasFixedWidth = double.IsNaN(itemWidth) == false; var hasFixedHeihgt = double.IsNaN(itemHeight) == false; var itemSize = new Size(hasFixedWidth ? itemWidth : constraint.Width, hasFixedHeihgt ? itemHeight : constraint.Height); foreach (var element in Children) { element.Measure(itemSize); var elementSize = new OrientedSize(orientation, hasFixedWidth ? itemWidth : element.DesiredSize.Width, hasFixedHeihgt ? itemHeight : element.DesiredSize.Height); if (lineSize.Direct + elementSize.Direct > maximumSize.Direct) { totalSize.Direct = Math.Max(lineSize.Direct, totalSize.Direct); totalSize.Indirect += lineSize.Indirect; lineSize = elementSize; if (elementSize.Direct > maximumSize.Direct) { totalSize.Direct = Math.Max(elementSize.Direct, totalSize.Direct); totalSize.Indirect += elementSize.Indirect; lineSize = new OrientedSize(orientation); } } else { lineSize.Direct += elementSize.Direct; lineSize.Indirect = Math.Max(lineSize.Indirect, elementSize.Indirect); } } totalSize.Direct = Math.Max(lineSize.Direct, totalSize.Direct); totalSize.Indirect += lineSize.Indirect; return new Size(totalSize.Width, totalSize.Height); }