天天看點

快速建構Windows 8風格應用17-布局控件

本篇博文主要介紹三種常用的布局控件:Canvas、Grid、StackPanel。

Panel可以承載多個子元素,面闆類可以把子元素存放在棧中、或網格裡面、或把子元素停靠在其邊緣等。

Panel類自身是一個抽象類,下面是Panel類的層次結構:

快速建構Windows 8風格應用17-布局控件

Windows 8 Store應用中包含的三個标準布局控件:Canvas(通常在正常布局中,盡量不要考慮使用Canvas,不過在某些特殊情況下,使用Canvas還是非常友善的)、Grid(它是大多數正常布局的首選)、StackPanel(可能是最簡單的一種面闆類型)。

Canvas

要在Canvas中定位元素,需要提供相對于左上角的水準坐标和豎直坐标。

快速建構Windows 8風格應用17-布局控件

代碼實作效果:

快速建構Windows 8風格應用17-布局控件

其中Left和Top屬性表示元素的左上角與Canvas左上角的相對位置。

一般來說Canvas比較适合把元素布局在任何位置上,是以這樣更适合于矢量圖形程式設計而不是控件布局程式設計。

同樣我們C#代碼中控制控件元素在Canvas中布局。

快速建構Windows 8風格應用17-布局控件

我們注意到xaml代碼中并沒有設定button的相對于Canvas的Left和Top屬性,這裡通過C#代碼進行設定。

快速建構Windows 8風格應用17-布局控件

SetValue方法定義在DependencyObject類裡面,LeftProperty和TopProperty是Canvas中DependencyProperty類型的靜态字段。

兩種布局設定方式最後實作效果是一樣。

Canvas還有一個附加屬性是ZIndex,我們可以使用ZIndex來更改預設元素的層次。

我們可以在一個或多個字元素中設定Canvas.ZIndex附加屬性,可以将這個屬性了解為螢幕中想出的Z軸,z值較大的元素會覆寫z值較小的元素。如果兩個元素具有相同的Canvas.ZIndex值,那麼會根據他們在Children集合中德順序來分層。

注意:雖然Canvas.ZIndex附加屬性定義在Canvas類中,但是它實際上适用于任何類型的面闆。另外如果我們自定義一個面闆類,其實我們并不需要處理Z值,布局系統會自動處理。

快速建構Windows 8風格應用17-布局控件

Grid

Grid是我們選擇面闆類時預設選擇,它非常靈活易用。

Grid讓我們可以想起HTML中的表格(Table),但兩者是有差異的:Grid不像HTML的表格,它并不是做格式化的工作,隻用于布局,并且也沒有标題或者内置單元格分割線等概念。

Grid具有一定數量的行和列;行的高度可以不一樣,列的高度也可以不一樣。Grid中的子元素可以占據一個特定的行和列,也可以占據多行和多列。雖然Grid功能非常強大,但也是需要付出代價的,我們在使用Grid的時候需要知道需要多少行和列來容納所有的子元素。

注意:嵌套Grid是十分常見,但不要濫用,特别是在程式會經常重新生成布局的情況下。過于複雜的嵌套會導緻布局非常混亂。

快速建構Windows 8風格應用17-布局控件

實作效果:

快速建構Windows 8風格應用17-布局控件

Grid定義了RowDefinitions和ColumnDefinitions兩個屬性,它們分别是RowDefinition和ColumnDefinition對象的集合。這些對象定義了每行的高度和每列的寬度,我們通常可以有三種選擇:

1)  使用單詞“Auto”;

2)  固定的像素;

3)  星号,或者數字後加星号;

通過Grid的附加屬性Grid.Row和Grid.Column來指明子元素所在的行和列。

快速建構Windows 8風格應用17-布局控件

StackPanel

StactPanel可以了解成已“棧”的形式将其子元素自頂向下或自左向右排列,并且子元素彼此之間不互相重疊。

預設情況下子元素是自頂向下排列的。

快速建構Windows 8風格應用17-布局控件

我們也可以設定子元素是自左向右排列。

快速建構Windows 8風格應用17-布局控件

我們可以通過StackPanel的Orientation屬性來改變子元素排列的方向。

快速建構Windows 8風格應用17-布局控件

當然我們也可以通過C#代碼來設定子元素的排列方向。

快速建構Windows 8風格應用17-布局控件

繼續閱讀