私のパネルは UniformGrid と同様のことをしようとします。ItemContainerWidth (40.0) および ItemContainerHeight (20.0) 依存プロパティに加えて、ColumnNumber プロパティがあります。
パネルのサイズを content に合わせたい。
私のメジャーオーバーライド:
protected override Size MeasureOverride(Size constraint)
{
if (constraint.Width == double.PositiveInfinity || constraint.Height == double.PositiveInfinity)
return Size.Empty;
for (int i = 0; i < InternalChildren.Count; i++)
{
InternalChildren[i].Measure(new Size(ItemContainerWidth, ItemContainerHeight));
}
return constraint;
}
私のアレンジオーバーライド:
protected override Size ArrangeOverride(Size finalSize)
{
int currentColumn = 0;
int currentRow = 0 ;
for (int i = 0; i < InternalChildren.Count; i++)
{
UIElement child = InternalChildren[i];
if (currentColumn == ColumnCount)
{
currentColumn = 0;
currentRow++;
}
currentColumn++;
double top = currentRow * ItemContainerHeight;
double left = currentColumn * ItemContainerWidth;
child.Arrange(new Rect(left, top, ItemContainerWidth, ItemContainerHeight));
}
return finalSize;
}
私のパネルの ActualWidth と Height は finalSize に等しいです。パネルのサイズを MeasureOvride (constraint) から返されたものにしたいと思います。
これを強制すると、パネルが画面上で別の場所に配置されます。パネルのサイズを、WrapPanel や StackPanel などのコンテンツに合わせて調整したいだけです。
最終サイズで
テスト目的で制約サイズ (100,100) を使用
パネルの私の使用: XAML:
<Grid>
<ItemsControl ItemsSource="{Binding Items, Mode=OneWay}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<uni:ScrollableUniformGrid ColumnCount="12" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="0,0,1,1">
<TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>