UniformGrid只能水平布局,如果需要垂直布局,重写UniformGrid
public class VerticalUniformGrid : UniformGrid
{
private int _columns;
private int _rows;
protected override Size MeasureOverride(Size constraint)
{
UpdateComputedValues();
Size availableSize = new(constraint.Width / _columns, constraint.Height / _rows);
double width = 0.0;
double height = 0.0;
int num3 = 0;
int count = InternalChildren.Count;
while (num3 < count)
{
UIElement element = base.InternalChildren[num3];
element.Measure(availableSize);
Size desiredSize = element.DesiredSize;
if (width < desiredSize.Width) width = desiredSize.Width;
if (height < desiredSize.Height) height = desiredSize.Height;
num3++;
}
return new Size(width * _columns, height * _rows);
}
private void UpdateComputedValues()
{
_columns = Columns;
_rows = Rows;
if (FirstColumn >= _columns) FirstColumn = 0;
if (FirstColumn > 0)
throw new NotImplementedException("There is no support for seting the FirstColumn (nor the FirstRow).");
if ((_rows == 0) || (_columns == 0))
{
int num = 0; // Visible children
int num2 = 0;
int count = InternalChildren.Count;
while (num2 < count)
{
UIElement element = InternalChildren[num2];
if (element.Visibility != Visibility.Collapsed) num++;
num2++;
}
if (num == 0) num = 1;
if (_rows == 0)
{
if (_columns > 0) _rows = ((num + FirstColumn) + (_columns - 1)) / _columns;
else
{
_rows = (int)Math.Sqrt(num);
if ((_rows * _rows) < num) _rows++;
_columns = _rows;
}
}
else if (_columns == 0) _columns = (num + (_rows - 1)) / _rows;
}
}
protected override Size ArrangeOverride(Size arrangeSize)
{
Rect finalRect = new(0.0, 0.0, arrangeSize.Width / _columns, arrangeSize.Height / _rows);
double height = finalRect.Height;
double yPos = arrangeSize.Height - height;
finalRect.X += finalRect.Width * FirstColumn;
finalRect.Y = 0;
foreach (UIElement element in InternalChildren)
{
element.Arrange(finalRect);
if (element.Visibility != Visibility.Collapsed)
{
finalRect.Y += height;
if (finalRect.Y > yPos + 0.00001)//这里有个double类型精度引起的Bug,暂时先加值规避一下
{
finalRect.X += finalRect.Width;
finalRect.Y = 0;
}
}
}
return arrangeSize;
}
}