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的。
示例代码如下:
我们知道StackPanel中控件默认是Vertical排列的,按理说Ellipse和TextBlock是应该按顺序排列的。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>
但是由于Canvas返回值是0,所以排列的时候TextBlock就也排到左上角去了。
效果如图:
http://www.devdiv.com/data/attachmen...fs9x6figf9.png
3. 安排控件位置
Grid根据子控件大小、Alignment,自身Padding,子控件Margin等安排子控件位置
StackPanel类似,只是如果子控件是Vertical顺序排列的,那么VerticalAlignment不起作用
Canvas,按照绝对布局来安排子件位置
安排子控件,在ArrangeOverride中实现
Regards
Vincent
http://weibo.com/xueyw

Reply With Quote

