/// <summary>
        /// Positionates each child in the available space of the NavigationBar depending on the expanding states.
        /// </summary>
        /// <param name="arrangeSize">The maximum possible space given by the parent control.</param>
        /// <returns>The calculated needed space in sum of all available child controls.</returns>
        protected override Size ArrangeOverride(Size arrangeSize)
        {
            var sizes = new Size[InternalChildren.Count];
            for (var i = 0; i < InternalChildren.Count; ++i)
            {
                var element = InternalChildren[i];
                if (element == null)
                    continue;

                sizes[i] = element.DesiredSize;
                var isSharing = GetIsExpanded(element);
                switch (Orientation)
                {
                    case Orientation.Horizontal:
                        if (isSharing)
                            sizes[i].Width = 0;
                        sizes[i].Height = arrangeSize.Height;
                        break;
                    case Orientation.Vertical:
                        if (isSharing)
                            sizes[i].Height = 0;
                        sizes[i].Width = arrangeSize.Width;
                        break;
                }
            }

            var heightLeft = arrangeSize.Height;
            var widthLeft = arrangeSize.Width;
            for (var i = 0; i < InternalChildren.Count; ++i)
            {
                var element = InternalChildren[i];
                if (element == null)
                    continue;

                var isSharing = GetIsExpanded(element);
                if (!isSharing && Orientation == Orientation.Horizontal)
                    widthLeft -= sizes[i].Width;
                else if (!isSharing && Orientation == Orientation.Vertical)
                    heightLeft -= sizes[i].Height;
            }

            double heightItemsCout = sizes.Count(i => i.Height == 0);
            double widthItemsCout = sizes.Count(i => i.Width == 0);

            var missingItemHeight = heightLeft / Math.Max(heightItemsCout, 1);
            var missingItemWidth = widthLeft / Math.Max(widthItemsCout, 1);

            for (var i = 0; i < InternalChildren.Count; ++i)
            {
                var element = InternalChildren[i];
                if (element == null)
                    continue;

                if (sizes[i].Height == 0)
                    sizes[i].Height = missingItemHeight;
                if (sizes[i].Width == 0)
                    sizes[i].Width = missingItemWidth;
            }

            var x = 0.0;
            var y = 0.0;
            for (var i = 0; i < InternalChildren.Count; ++i)
            {
                var element = InternalChildren[i];
                if (element == null)
                    continue;

                var size = sizes[i];
                var position = new Rect(x, y, size.Width, size.Height);
                element.Arrange(position);

                if (Orientation == Orientation.Horizontal)
                    x += size.Width;
                else
                    y += size.Height;
            }

            return arrangeSize;
        }