在WPF休系中,對於佈局,要比WinForm 豐富,也比web中豐富(儘管web中能夠利用Table和div很好的完成佈局),由於WPF這個技術就是專門爲UI層來設計的,因此在處理UI的時候,變的異常豐富。web
支持UI主要用面板(即一個父控件,起承載的做用)來實現,在WPF中,主要的面板有如下幾種: ide
元素名稱佈局 |
說明spa |
Canvas設計 |
定義一個區域,在此區域內,您可使用相對於 Canvas 區域的座標顯式定位子元素。orm |
定義一個區域,在此區域中,您可使子元素互相水平或垂直排列。繼承 |
|
Grid遞歸 |
|
將子元素排列成一行(可沿水平或垂直方向)。 |
|
處理 TabControl 中選項卡按鈕的佈局。 |
|
在 ToolBar 控件內排列內容。 |
|
UniformGrid 用於在網格內按所有相等的單元格大小排列子元素。 |
|
提供面板的一個基類,該基類可以「虛擬化」面板的子集合。 |
|
將內容排列成一行(可沿水平或垂直方向),並使內容虛擬化。 |
|
WrapPanel 從左至右按順序位置定位子元素,並在包含框的邊緣處將內容斷開至下一行。 後續排序按照從上至下或從右至左的順序進行,具體取決於 Orientation 屬性的值。 |
這些面板都是繼承Panel而來。
Panel是一個面板的抽象類,是全部面板的基類,它是繼承結構以下:
System .Object
System.Windows.Threading .DispatcherObject
System.Windows .DependencyObject
System.Windows.Media .Visual
System.Windows .UIElement
System.Windows .FrameworkElement
System.Windows.Controls .Panel
System.Windows.Controls .Canvas
System.Windows.Controls .DockPanel
System.Windows.Controls .Grid
System.Windows.Controls.Primitives .TabPanel
System.Windows.Controls.Primitives .ToolBarOverflowPanel
System.Windows.Controls.Primitives .UniformGrid
System.Windows.Controls .StackPanel
System.Windows.Controls .VirtualizingPanel
System.Windows.Controls .WrapPanel
不一樣的面板,來分別實現不一樣的佈局,這要比WinForm和WebForm中的Panel細化一層,能夠實現不一樣的佈局,這也能體現出WPF在作UI的更強大的一面。
WPF中的佈局,是依據本身的特性來展開的,由於WPF是採用標籤嵌套的方式來表示標籤間的關係,因此在更新父級標籤時,在佈局上要影響子標籤的顯示。因此在WPF中,一但父級標籤佈局發生變化,全部子級標籤都要進行更新。
一個佈局發生變化,並最終完成變化的生命週期是先由變化的佈局標籤的父類UIElement(由於全部的Panel子類都是從UIElement繼承下來的),的對應屬性發生變化,而後是FrameworkElement類相應的屬性發生改變,再由具體的Panel根據本身的特色來計算標籤的大小,若是該標籤還有子標籤,那就再計算,依次遞歸,計算好後,就能夠來佈局計算好的標籤了。當再次某標籤佈局發生變化,這個過程就重複執行。
更新標籤時,分兩步來進行,第一步是計算標籤的相應值(好比寬Width和高Height),第二步是佈局標籤。計算和佈局分別由MeasureOverride和ArrangeOverride方法來完成的,這兩個方法都是從FrameworkElement繼承而來的。
由於Panel佈局時,要引起本標籤下的全部標籤計算和佈局,因此儘可能避免引起沒必要要的從新Panel計算和Panel佈局。