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