私の知る限り、分離コードで行う必要があります。
必要なセルを 3 で割り、切り上げるだけです。
グリッドからコントロールを派生させます。セル番号のカスタム添付プロパティを作成します。次に、MeasureOverride をオーバーライドし、切り上げられた行数によってグリッドの行定義を設定します。次に、コントロールから読み取ったセル番号に対応するように、各項目に grid.row と grid.column を設定します。
次に、デフォルトの grid.measureoverride を呼び出します。
public class ArrangeGrid : Grid
{
public ArrangeGrid()
{
ColumnDefinitions.Add(new ColumnDefinition());
ColumnDefinitions.Add(new ColumnDefinition());
ColumnDefinitions.Add(new ColumnDefinition());
}
public static DependencyProperty GridCellProperty = DependencyProperty.RegisterAttached("GridCell", typeof(int), typeof(ArrangeGrid));
public static void SetGridCell(UIElement element, int value)
{
element.SetValue(ArrangeGrid.GridCellProperty, value);
}
[AttachedPropertyBrowsableForChildren]
public static int GetGridCell(UIElement element)
{
return (int)element.GetValue(ArrangeGrid.GridCellProperty);
}
protected override Size MeasureOverride(Size constraint)
{
RowDefinitions.Clear();
int rowCount = this.Children.Count / 3;
if (this.Children.Count % 3 != 0)
{
rowCount += 1;
}
while (RowDefinitions.Count < rowCount)
{
RowDefinitions.Add(new RowDefinition());
}
foreach (var child in this.Children)
{
int gridCell = ArrangeGrid.GetGridCell((UIElement)child);
int gridRow = gridCell / 3;
int gridCol = gridCell % 3;
((UIElement)child).SetValue(Grid.RowProperty, gridRow);
((UIElement)child).SetValue(Grid.ColumnProperty, gridCol);
}
return base.MeasureOverride(constraint);
}
}
明らかに、これは GridCell プロパティなしで実行できます。また、グリッド セルをスキップすると、いくつかのバグが発生しますが、このコードを用途に合わせて調整できるはずです。