【李会军】一步一步学Silverlight 2系列(3):界面布局
Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。
本文为系列文章第三篇,学习Silverlight 2中的界面布局,Silverlight 2中新增加了Grid和Panel两个布局容器,使得界面布局更加的强大和灵活。
Canvas面板
Canvas
是在Silverlight 1.0时代就有的一种基础布局面板,它采用绝对坐标定位。可以使用附加属性(Attached
Property)对Canvas中的元素进行定位,通过附加属性我们指定控件相对于其直接父容器Canvas
控件的上、下、左、右坐标的位置。如下面的XAML声明了两个矩形,它们分别相对于父容器Canvas的左边距是50,相对于父容器Canvas的上边距
分别是50和150:
e8m;}1l}F&]0
ITPUB个人空间T'\9sIN.L dw
ITPUB个人空间A
b?D4qH_ITPUB个人空间Z"r2?)IA b
除了上面我们用到的Canvas.Top和Canvas.Left两个附加属性外,还有一个Canvas.ZIndex附加属性。如果指定了两个控件相对 于父容器Canvas同样的边距,则后面声明的控件父覆盖前面声明的控件。这时我们可以使用Canvas.ZIndex属性来改变它们的显示顺序,如下面 的XAML声明:
Ok Bc#k1D!Y&IkZe0
<CanvasBackground="#46461F">ITPUB个人空间!cS!MZR1p
<RectangleFill="#0099FF"Width="160"Height="80"
,d)x2qy0s6kNi0Canvas.Top="100"Canvas.Left="100">
7U q.v8Wv3f3U0Tj6k0
m"x0T3\5[h'w0<RectangleFill="#FF9900"Width="160"Height="80"ITPUB个人空间u Wm4mi|J{^9O Yz
Canvas.Top="100"Canvas.Left="100"/>
B;Yzk4L#Ap!? y0指定两个矩形相对于父容器Canvas的边距相同,这时默认的后声明的橙色矩形会覆盖蓝色矩形:ITPUB个人空间 `k7^7{0Mkv wITPUB个人空间^+nI.T,x?
指定Canvas.ZIndex为1
.Q.G#W%kK0<CanvasBackground="#46461F">
!o;w GSgi Y"v0<RectangleFill="#0099FF"Width="160"Height="80"ITPUB个人空间2x$IBw$^W.r
Canvas.Top="100"Canvas.Left="100"Canvas.ZIndex="1"/>ITPUB个人空间C7NOQl Pc(^
ITPUB个人空间~'nq.X$l5EA$wW4r!z8J
<RectangleFill="#FF9900"Width="160"Height="80"
"\:a6_cz#y0Canvas.Top="100"Canvas.Left="100"/>ITPUB个人空间/o5nd#Yz5z0R&XCA)X]%Z
</Canvas>ITPUB个人空间t_[GX)L
将会让蓝色矩形显示在上面,值最大的显示在最上面:ITPUB个人空间_`RV/`C} Y.gF
ITPUB个人空间i&ks'lK D9XJ0p.r
StackPanel
StackPanel支持用行或列的方式来进行页面布局,默认情况下所有的子元素会垂直的排列显示,如下面的XAML声明三个矩形:
<StackPanelBackground="#46461F">
0^0\l'da l/H:Mli0<RectangleFill="#0099FF"Stroke="White"
/o r/gAOK2kQ.IY)_0Width="100"Height="50"Margin="10"/>
F4I_)Jq$obF(D;J0<RectangleFill="#0099FF"Stroke="White"
'L1y0I2b;E1W-T0Width="100"Height="50"Margin="10"/>ITPUB个人空间+^#J'Tl*Vji2|
<RectangleFill="#0099FF"Stroke="White"ITPUB个人空间.a_'VzRLv0A
Width="100"Height="50"Margin="10"/>ITPUB个人空间(U o OX|w
</StackPanel>
运行后在界面显示效果如下:

\jZ(|CO#v`z_0
当然我们也可以指定为水平排列,通过Orientation属性指定:
<StackPanelBackground="#46461F"Orientation="Horizontal">ITPUB个人空间`7ZQkF/A
<RectangleFill="#0099FF"Stroke="White"
BhB+oX2Z5x*D8T0Width="100"Height="50"Margin="10"/>
a*d ^)r-dn0<RectangleFill="#0099FF"Stroke="White"
T"UGa)g:[`0Width="100"Height="50"Margin="10"/>ITPUB个人空间7^1bQ.NNo:Y
<RectangleFill="#0099FF"Stroke="White"ITPUB个人空间/L;NU|Y o)Q
Width="100"Height="50"Margin="10"/>ITPUB个人空间7Ia+b)[4wu2?7JW
</StackPanel>
运行后界面显示效果如下:

Hx}2P'd*@0
在这里为了让各个控件之间有一定的距离,使用了Margin属性,该属性类似于HTML中的Margin。
Grid
Grid控件类似与HTML中的Table,只不过子元素不用放在单元格中。通过<Grid.RowDefinitions> 和 <Grid.ColumnDefinitions>来定义Grid的行和列,使用Grid.Row和Grid.Column两个附加属性指定 子元素在Grid中显示的位置,这是一种非常灵活的布局方式。如下面的XAML声明:
<Gridx:Name="LayoutRoot"Background="#46461F"ShowGridLines="True">
:^cf EM,v0<Grid.RowDefinitions>ITPUB个人空间.V"Lc2T.t&`u
<RowDefinitionHeight="120"/>ITPUB个人空间 CW@~l{"Q H9e
<RowDefinitionHeight="*"/>
wv @F&O&N;?rw0</Grid.RowDefinitions>
9Z%Wk&C/VgC0<Grid.ColumnDefinitions>
