2.4 Canvas面板布局

Canvas面板也被称为画布面板,是一种根据子元素所处位置的坐标值来进行定位的布局面板。这与Windows Forms窗体程序设计中,通过将控件放置于窗体Form中,由控件的左上角顶点在窗体Form中的绝对位置来决定控件的位置是相似的。因此,Canvas面板非常适合用于游戏程序设计。

在实际使用中,Canvas面板中的子元素,通过设置附加属性Canvas.Left和Canvas.Top来设定子元素的左上角顶点的坐标。一般以Canvas的左上角顶点作为坐标原点,则Canvas.Left相当于子元素的X轴坐标值,Canvas.Top相当于子元素的Y轴坐标值。

由此,不难发现采用Canvas面板放置子元素比较容易出现子元素重叠的现象。如果多个子元素发生重叠,又需要控制重叠的顺序,可以通过设置Canvas.ZIndex值实现,Canvas.ZIndex值越大,处于最上层。例如,有两个Button出现重叠,Button1的Canvas.ZIndex=1,而Button2的Canvas.ZIndex=2,则Button2会叠在Button1的上面。

在Windows phoneMango手机中,有一个用于显示拨号键盘的图标,如图2-13所示,是由一组浅色的矩形拼合成的。这一图标可以通过Canvas面板来生成,代码如下。

图2-13 显示拨号键盘的图标

XAML代码:Canvas.xaml

<Canvas Width="64" Height="72" Grid.Row="1">
        <!--Add a style to this canvas’s resource dictionary-->
        <Rectangle Width="16" Height="16" Fill="White" />
       <Rectangle Canvas.Left="24" Width="16" Height="16" Fill="White"/>
       <Rectangle Canvas.Left="48" Width="16" Height="16" Fill="White"/>
       <Rectangle Canvas.Top="24" Width="16" Height="16" Fill="White"/>
       <Rectangle Canvas.Left="24" Canvas.Top="24" Width="16" Height="16" Fill="White"/>
       <Rectangle Canvas.Left="48" Canvas.Top="24" Width="16" Height="16" Fill="White"/>
       <Rectangle Canvas.Top="48" Width="16" Height="16" Fill="White"/>
       <Rectangle Canvas.Left="24" Canvas.Top="48" Width="16" Height="16" Fill="White"/>
       <Rectangle Canvas.Left="48" Canvas.Top="48" Width="16" Height="16" Fill="White"/>
       <Rectangle Canvas.Left="24" Canvas.Top="72" Width="16" Height="16" Fill="White"/>
</Canvas>

上述代码中,Rectangle表示矩形控件,Canvas.Left和Canvas.Top分别指定矩形距离Canvas面板左上角顶点的横坐标(X轴)与纵坐标(Y轴)的值,如果未明确指定则默认表示值为0。例如,<Rectangle Width="16" Height="16" Fill="#FFF8F2F2" />矩形未指定Canvas.Left和Canvas.Top值,表示两值都为0,则此矩形的左上角顶点坐标与Canvas左上角顶点坐标重合。

实现上述拨号图标的程序代码如下:

VBnet代码:Canvas2.xaml.vb

Private Sub PhoneApplicationPage_Loaded(sender As System.Object,e As System.Windows.RoutedEventArgs)Handles MyBase.Loaded
    Dim rec As Rectangle '表示图标中白色小方块的矩形
    Dim i As Integer=0
    Dim j As Integer=0
    For i=0 To 2 '
       For j=0 To 2
          rec=New Rectangle
          rec.Fill=New SolidColorBrush(Colors.White)
          rec.Width=16
          rec.Height=16
          '采用Controls.Canvas.SetLeft设置左顶点的X轴坐标值
          Controls.Canvas.SetLeft(rec,j * 24)
          '采用Controls.Canvas.SetTop设置左顶点的Y轴坐标值
          Controls.Canvas.SetTop(rec,i * 24)
          '将rec矩形作为子元素添加到Canvas1面板中
          Me.Canvas1.Children.Add(rec)
       Next
    Next
    rec=New Rectangle With {
      .Height=16,.Width=16,.Fill=New SolidColorBrush(Colors.White)} Controls.Canvas.SetLeft(rec,24)
    Controls.Canvas.SetTop(rec,72)
    Me.Canvas1.Children.Add(rec)
End Sub

代码定义矩形变量作为图标中的白色小方块,通过双重循环往Canvas面板中添加9个矩形。这些矩形添加在Canvas的Children集合中,作为Canvas的子元素。每个矩形的定位通过Controls.Canvas.SetLeft和Controls.Canvas.SetTop来设定,最后又单独添加了一个处于最下端的矩形块。