我的面板尝试执行类似于 UniformGrid 的操作,除了 ItemContainerWidth (40.0) 和 ItemContainerHeight (20.0) 依赖属性之外,它还有一个 ColumnNumber 属性。
我希望我的面板根据它的内容调整大小。
我的 MesureOverride :
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>