You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.5 KiB

using Microsoft.Maui.Layouts;
namespace ex_BindingToA2dArray_v2.MyLayouts;
public class MatrixLayoutManager : ILayoutManager
{
MatrixLayout? MatrixLayout {get; set;}
double LayoutWidth {get; set;}
double LayoutHeight {get; set;}
double MaxCellWidth {get; set;}
double MaxCellHeight {get; set;}
public MatrixLayoutManager(MatrixLayout matrixLayout)
{
MatrixLayout = matrixLayout;
}
public Size Measure(double widthConstraint, double heightConstraint)
{
if(MatrixLayout == null)
return new Size(widthConstraint, heightConstraint);
int nbRows = MatrixLayout.NbRows;
int nbColumns = MatrixLayout.NbColumns;
var padding = MatrixLayout.Padding;
var horizontalSpacing = MatrixLayout.HorizontalSpacing;
var verticalSpacing = MatrixLayout.VerticalSpacing;
MaxCellWidth = (widthConstraint - padding.HorizontalThickness - (nbColumns - 1)* horizontalSpacing)/nbColumns;
MaxCellHeight = (heightConstraint - padding.VerticalThickness - (nbRows - 1)* verticalSpacing)/nbRows;
double minDim = Math.Min(MaxCellWidth, MaxCellHeight);
MaxCellWidth = minDim;
MaxCellHeight = minDim;
LayoutWidth = MaxCellWidth*nbColumns + (nbColumns-1)* horizontalSpacing + padding.HorizontalThickness;
LayoutHeight = MaxCellHeight*nbRows + (nbRows-1)* verticalSpacing + padding.VerticalThickness;
return new Size(LayoutWidth, LayoutHeight);
}
public Size ArrangeChildren(Rect bounds)
{
if(MatrixLayout == null)
return new Size(LayoutWidth, LayoutHeight);
var padding = MatrixLayout.Padding;
var horizontalSpacing = MatrixLayout.HorizontalSpacing;
var verticalSpacing = MatrixLayout.VerticalSpacing;
int nbColumns = MatrixLayout.NbColumns;
double top = padding.Top + bounds.Top;
double left = padding.Left + bounds.Left;
for (int cellId = 0; cellId < MatrixLayout.Count; cellId++)
{
var cell = MatrixLayout[cellId];
int numRow = cellId / nbColumns;
int numColumn = cellId - numRow * nbColumns;
double leftSide = left + numColumn * (MaxCellWidth + horizontalSpacing);
double topSide = top + numRow * (MaxCellHeight + verticalSpacing);
var destination = new Rect(leftSide, topSide, MaxCellWidth, MaxCellHeight);
cell.Arrange(destination);
}
return new Size(LayoutWidth, LayoutHeight);
}
}