Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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);
            }
        }