public static Size Measure(IWrapPanel panel, Size availableSize) { var orientation = panel.Orientation; var result = new OrientedSize(orientation); var lineSize = new OrientedSize(orientation); var orientedConstraint = new OrientedSize(orientation, availableSize); var itemWidth = panel.ItemWidth.IsNaN() ? (double?)null : panel.ItemWidth; var itemHeight = panel.ItemHeight.IsNaN() ? (double?)null : panel.ItemHeight; var itemConstraintSize = new Size(itemWidth ?? availableSize.Width, itemHeight ?? availableSize.Height); foreach (var element in panel.Elements) { element.Measure(itemConstraintSize); var elementSize = element.GetDesiredOrientedSize(orientation, itemWidth, itemHeight); if (orientedConstraint.Direct.IsLessThan(lineSize.Direct + elementSize.Direct, XamlConstants.LayoutComparisonPrecision)) { result = result.WrapSize(lineSize); lineSize = elementSize; if (!orientedConstraint.Direct.IsLessThan(elementSize.Direct, XamlConstants.LayoutComparisonPrecision)) { continue; } result = result.WrapSize(elementSize); lineSize = new OrientedSize(orientation); } else { lineSize = lineSize.StackSize(elementSize); } } return(result.WrapSize(lineSize).Size); }
public static OrientedSize WrapSize(this OrientedSize self, Size itemSize) { return(self.WrapSize(itemSize.AsOriented(self.Orientation))); }