/// <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; }