WPF佈局

在WPF休系中,對於佈局,要比WinForm 豐富,也比web中豐富(儘管web中可以利用Table和div很好的完成佈局),因爲WPF這個技術就是專門爲UI層來設計的,所以在處理UI的時候,變的異常豐富。

支持UI主要用面板(即一個父控件,起承載的作用)來實現,在WPF中,主要的面板有以下幾種:

元素名稱

說明

Canvas

定義一個區域,在此區域內,您可以使用相對於 Canvas 區域的座標顯式定位子元素。

DockPanel

定義一個區域,在此區域中,您可以使子元素互相水平或垂直排列。

Grid

定義由行和列組成的靈活網格區域。可以使用 Margin 屬性精確定位 Grid 的子元素。

StackPanel

將子元素排列成一行(可沿水平或垂直方向)。

TabPanel

處理 TabControl 中選項卡按鈕的佈局。

ToolBarOverflowPanel

ToolBar 控件內排列內容。

UniformGrid

UniformGrid 用於在網格內按全部相等的單元格大小排列子元素。

VirtualizingPanel

提供面板的一個基類,該基類能夠“虛擬化”面板的子集合。

VirtualizingStackPanel

將內容排列成一行(可沿水平或垂直方向),並使內容虛擬化。

WrapPanel

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佈局。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章