File: Layouts\HorizontalStackLayoutManager.cs
Web Access
Project: src\src\Core\src\Core.csproj (Microsoft.Maui)
using System;
using Microsoft.Maui.Graphics;
 
namespace Microsoft.Maui.Layouts
{
	public class HorizontalStackLayoutManager : StackLayoutManager
	{
		public HorizontalStackLayoutManager(IStackLayout layout) : base(layout)
		{
		}
 
		public override Size Measure(double widthConstraint, double heightConstraint)
		{
			var padding = Stack.Padding;
 
			double measuredWidth = 0;
			double measuredHeight = 0;
			int spacingCount = 0;
 
			for (int n = 0; n < Stack.Count; n++)
			{
				var child = Stack[n];
 
				if (child.Visibility == Visibility.Collapsed)
				{
					continue;
				}
 
				spacingCount += 1;
				var measure = child.Measure(double.PositiveInfinity, heightConstraint - padding.VerticalThickness);
				measuredWidth += measure.Width;
				measuredHeight = Math.Max(measuredHeight, measure.Height);
			}
 
			measuredWidth += MeasureSpacing(Stack.Spacing, spacingCount);
			measuredWidth += padding.HorizontalThickness;
			measuredHeight += padding.VerticalThickness;
 
			var finalHeight = ResolveConstraints(heightConstraint, Stack.Height, measuredHeight, Stack.MinimumHeight, Stack.MaximumHeight);
			var finalWidth = ResolveConstraints(widthConstraint, Stack.Width, measuredWidth, Stack.MinimumWidth, Stack.MaximumWidth);
 
			return new Size(finalWidth, finalHeight);
		}
 
		public override Size ArrangeChildren(Rect bounds)
		{
			var padding = Stack.Padding;
			double spacing = Stack.Spacing;
			var childCount = Stack.Count;
 
			double top = padding.Top + bounds.Top;
 
			var height = bounds.Height - padding.VerticalThickness;
 
			// Figure out where we're starting from 
			double xPosition = padding.Left + bounds.Left;
 
			for (int n = 0; n < Stack.Count; n++)
			{
				var child = Stack[n];
 
				if (child.Visibility == Visibility.Collapsed)
				{
					continue;
				}
 
				xPosition += ArrangeChild(child, height, top, xPosition);
 
				if (n < childCount - 1)
				{
					// If we have more than one child and we're not on the last one, add spacing
					xPosition += spacing;
				}
			}
 
			var actual = new Size(xPosition, height);
 
			return actual.AdjustForFill(bounds, Stack);
		}
 
		static double ArrangeChild(IView child, double height, double top, double x)
		{
			var destination = new Rect(x, top, child.DesiredSize.Width, height);
			child.Arrange(destination);
			return destination.Width;
		}
	}
}