在WPF休系中,對於佈局,要比WinForm 豐富,也比web中豐富(儘管web中可以利用Table和div很好的完成佈局),因爲WPF這個技術就是專門爲UI層來設計的,所以在處理UI的時候,變的異常豐富。
支持UI主要用面板(即一個父控件,起承載的作用)來實現,在WPF中,主要的面板有以下幾種:
元素名稱 | 說明 |
定義一個區域,在此區域內,您可以使用相對於 Canvas 區域的座標顯式定位子元素。 | |
定義一個區域,在此區域中,您可以使子元素互相水平或垂直排列。 | |
將子元素排列成一行(可沿水平或垂直方向)。 | |
處理 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佈局。