2009年4月1日 星期三

[WPF] Layout

Panel

ContentControl 中衍生出來的 class 都有 Content 屬性,幾乎可以被設定為任何物件,但問題在於「Content 只能設定一個物件」。

然而一個視窗中怎麼可能只放一個物件呢? 因此在 WPF 中使用了 Panel 作為解決此問題的方式,而 Panel 的階層與衍生類別如下:

UIElement

每種不同的 panel 有其自訂的 layout model,例如:

StackPanel 用水平或垂直 stack 的方式安排子元素

WrapPanel 類似 StackPanel,但可以將自動將元素擺到下一個 columm 或是 row 的位置

DockPanel 則會根據 parent container 的內部邊界來進行自動擺設

Grid 則是把所有子元素以格子狀的方式擺設

UniformGrid 則是所有的行都等寬,列都等高

Canvas 則是最貼近原本的做法,每個元素都有自己的座標位置


Dock

重點就在於 dock 的位置了,分別是 Top、Bottom、Left、Right 四種,如果將控制項的 HorizontalAlignment 設定為 Center,整個版面會變得很奇怪,因此在撰寫上要注意一下。

element 的定位必須使用 DockPanel.SetDock() 來處理。


Grid

蠻龜毛的一個 layout panel,必須要先定義 RowDefinition 以及 ColumnDefinition 並加入到 Grid 中,才能將控制項加入到 Grid 中。

而控制項加入時還要透過 Grid.SetRow() 以及 Grid.SetColumn() 來設定控制項在 Grid 中的位置。

element 的定位必須使用 Grid.SetRow()Grid.SetColumn()Grid.SetRowSpan()Grid.SetColumnSpan() 來處理。


Canvas


element 的定位必須使用 Canvas.SetLeft()Canvas.SetTop()Canvas.SetRight()Canvas.SetBottom() 等方法來處理。


事件處理

若將 event 處理指定給特定的控制項,例如:

Button.Click += ButtonOnClick;

void ButtonOnClick(object sender, RoutedEventArgs args)
{
MessageBox.Show("Hello");
}


當然,也可以把 event 透過 this.AddHandler 註冊給 Window 物件(包含 Button),但是就要在 function 中透過 args.Source 來判斷控制項的型態了,設定方式如下:

this.AddHandler(Button.ClickEvent, new RoutedEventHandler(ButtonOnClick));


既然可以將 event 註冊給 Window 物件,當然也可以註冊給 Panel 物件囉!

沒有留言:

張貼留言