private static void ShrinkFromStart(FlexElementCollection elements, double target) { var useLayoutRounding = elements.UseLayoutRounding; if (useLayoutRounding) { target = target.LayoutRound(elements.Orientation, RoundingMode.MidPointFromZero); } if (elements.TryShrinkToMinimum(target)) { return; } var current = elements.Actual; if (current.IsLessThanOrClose(elements.ActualMinimum)) { return; } for (var index = 0; index < elements.Count; index++) { var item = elements[index]; var compensation = Math.Min(current - target, item.ActualLength - item.ActualMinLength); item.ActualLength -= compensation; elements[index] = item; current -= compensation; if (current.IsCloseTo(target, XamlConstants.LayoutComparisonPrecision)) { break; } } }
private void ShrinkAllImpl(FlexElementCollection elements, double target) { var useLayoutRounding = elements.UseLayoutRounding; var originalTarget = target; var orientation = elements.Orientation; if (useLayoutRounding) { target = target.LayoutRound(orientation, RoundingMode.MidPointFromZero); } if (elements.TryShrinkToMinimum(target)) { return; } target -= Sort(elements, FlexDistributeDirection.Shrink); try { var deadlock = true; do { var tmpTarget = target; for (var iItem = 0; iItem < _currentCount; iItem++) { var item = _sortedElements[iItem]; if (item.ActualLength * (_currentCount - iItem) >= tmpTarget) { deadlock = false; var success = true; var avg = tmpTarget / (_currentCount - iItem); if (useLayoutRounding) { avg = avg.LayoutRound(orientation, RoundingMode.MidPointFromZero); } for (var jItem = iItem; jItem < _currentCount; jItem++) { var titem = _sortedElements[jItem]; if (avg > titem.MinLength) { titem.ActualLength = avg; } else { titem.ActualLength = titem.MinLength; success = false; } _sortedElements[jItem] = titem; if (success) { continue; } target -= titem.ActualLength; RemoveAt(elements, jItem); jItem--; } if (success) { return; } break; } tmpTarget -= item.ActualLength; } } while (_currentCount > 0 && deadlock == false); } finally { RestoreOrder(elements); DistributeRoundingError(elements, elements.Actual - originalTarget); } }