布局的复杂性--深入理解面板类
新建项目SingleCellGridDemo,新增SingleCellGrid.cs类。
public class SingleCellGrid:Panel
{
//MeasureOverride和ArrangeOverride是面板类的两个可重写的方法。第一个是为父元素确定其每个子元素的大小,第二个是父元素把子元素排列到相对于自身的位置上。
protected override Size MeasureOverride(Size availableSize)
//avaliableSize是面板类的父元素可提供的大小。面板类所需的大小是compositSize。
{
Size compositeSize = new Size();
foreach (UIElement child in Children)
{
child.Measure(availableSize);
//measure用于适当的调整子元素的DesiredSize值。
compositeSize.Width = Math.Min(compositeSize.Width, child.DesiredSize.Width);
compositeSize.Height = Math.Min(compositeSize.Height, child.DesiredSize.Height);
//Grid面板,将子元素中最大值赋给compositeSize。
}
return compositeSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
foreach (UIElement child in Children)
{
child.Arrange(new Rect(new Point(), finalSize));
//Rec表示子元素相对于父元素左上角的位置,以及其大小。
}
return base.ArrangeOverride(finalSize);
}
}
xaml调用SingleCellGrid类
1 xmlns:local="clr-namespace:SingleCellGridDemo"
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<local:SingleCellGrid>
<TextBlock Text="TextBlock aligned at right bottom" HorizontalAlignment="Right" VerticalAlignment="Bottom"></TextBlock>
<Image Source="kauai.jpg"></Image>
<Ellipse Stroke="{StaticResource PhoneAccentBrush}" StrokeThickness="24"></Ellipse>
<TextBlock Text="TextBlock aligned at left top" HorizontalAlignment="Left" VerticalAlignment="Top"></TextBlock>
</local:SingleCellGrid>
</Grid>
浙公网安备 33010602011771号