Exemple #1
0
        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;
        }
Exemple #3
0
        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));
        }
Exemple #4
0
        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);
        }