Grid、StackPanel及Canvas比较学习
1. Alignment是否起作用
Grid中Child设置HorizontalAlignment和VerticalAlignment都是起作用的;
StackPanel中,如果子控件是Vertical排列的(即StackPanel的Orientation设置为Vertical),那么子控件只有HorizontalAlignment起作用;
Canvas的HorizontalAlignment和VerticalAlignment都是不起作用的。
2. 控件所占位置大小
一般父控件会调用子控件的MeasureOverride来确定控件需要占用的空间。
Grid中所有子控件中最大的,就是Grid需要占用的空间,因为单一Grid中子控件默认都是以左上角为原点重叠排列的,除非改变Alignment;
StackPanel中,控件是顺序排列的,所以StackPanel在一个方向取所有子控件的大小之和,另一个方向取最大值;
Canvas最特殊,它占用的空间为0,即Canvas的MeasureOverride返回值为0。
我们通过一个直观的例子来说明Canvas的MeasureOverride的确是返回0的。
示例代码如下:
[CODE]<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<Canvas>
<Ellipse Width="200" Height="200" Stroke="Green" StrokeThickness="10"/>
</Canvas>
<TextBlock>HelloWorld</TextBlock>
</StackPanel>
</Grid>[/CODE]
我们知道StackPanel中控件默认是Vertical排列的,按理说Ellipse和TextBlock是应该按顺序排列的。
但是由于Canvas返回值是0,所以排列的时候TextBlock就也排到左上角去了。
效果如图:
[URL="http://www.devdiv.com/data/attachment/blog/201209/28/184837w1efz6fs9x6figf9.png"]http://www.devdiv.com/data/attachment/blog/201209/28/184837w1efz6fs9x6figf9.png[/URL]
3. 安排控件位置
Grid根据子控件大小、Alignment,自身Padding,子控件Margin等安排子控件位置
StackPanel类似,只是如果子控件是Vertical顺序排列的,那么VerticalAlignment不起作用
Canvas,按照绝对布局来安排子件位置
安排子控件,在ArrangeOverride中实现
Regards
Vincent
[url]http://weibo.com/xueyw[/url]
Re: Grid、StackPanel及Canvas比较学习