| File: Layouts\FlexLayoutManager.cs | Web Access |
| Project: src\src\Core\src\Core.csproj (Microsoft.Maui) |
#nullable enable using System; using Microsoft.Maui.Graphics; namespace Microsoft.Maui.Layouts { public class FlexLayoutManager : ILayoutManager { IFlexLayout FlexLayout { get; } public FlexLayoutManager(IFlexLayout flexLayout) { FlexLayout = flexLayout; } public Size ArrangeChildren(Rect bounds) { var padding = FlexLayout.Padding; double top = padding.Top + bounds.Top; double left = padding.Left + bounds.Left; double availableWidth = bounds.Width - padding.HorizontalThickness; double availableHeight = bounds.Height - padding.VerticalThickness; FlexLayout.Layout(availableWidth, availableHeight); foreach (var child in FlexLayout) { var frame = FlexLayout.GetFlexFrame(child); if (double.IsNaN(frame.X) || double.IsNaN(frame.Y) || double.IsNaN(frame.Width) || double.IsNaN(frame.Height)) throw new Exception("something is deeply wrong"); frame = frame.Offset(left, top); child.Arrange(frame); } return bounds.Size; } public Size Measure(double widthConstraint, double heightConstraint) { var padding = FlexLayout.Padding; var availableWidth = widthConstraint - padding.HorizontalThickness; var availableHeight = heightConstraint - padding.VerticalThickness; double measuredHeight = 0; double measuredWidth = 0; FlexLayout.Layout(availableWidth, availableHeight); foreach (var child in FlexLayout) { if (child.Visibility == Visibility.Collapsed) { continue; } var frame = FlexLayout.GetFlexFrame(child); measuredHeight = Math.Max(measuredHeight, frame.Bottom); measuredWidth = Math.Max(measuredWidth, frame.Right); } var finalHeight = LayoutManager.ResolveConstraints(heightConstraint, FlexLayout.Height, measuredHeight + padding.VerticalThickness, FlexLayout.MinimumHeight, FlexLayout.MaximumHeight); var finalWidth = LayoutManager.ResolveConstraints(widthConstraint, FlexLayout.Width, measuredWidth + padding.HorizontalThickness, FlexLayout.MinimumWidth, FlexLayout.MaximumWidth); return new Size(finalWidth, finalHeight); } } }