學習WPF——WPF佈局——瞭解佈局容器

WPF佈局工做內部原理
WPF渲染布局時主要執行了兩個工做:測量和排列
測量階段,容器遍歷全部子元素,並詢問子元素所指望的尺寸
排列階段,容器在合適的位置放置子元素,並設置元素的最終尺寸
這是一個遞歸的過程,界面中任何一個容器元素都會被遍歷到
WPF佈局容器的繼承機制
DispatcherObject
WPF應用程序使用單線程親和模型(STA:Single-Thread Affinity),這意味着整個用戶界面都爲單個線程擁有,同時也意味着從另外一個線程與用戶界面元素交互是不安全的,但有不少狀況下須要從其餘線程訪問界面元素,那怎麼辦呢?WPF有一個統一的機制來處理這些問題,這個咱們在後續的章節涉及到以後再深刻講解,你們只要知道,只要繼承DispatcherObject的界面元素就能很方便的處理這些問題就好啦
DependencyObject
WPF的屬性的實現機制和Winform程序有很大的差別,Winform控件的屬性不少是經過繼承機制得來的,在你認爲超過90%的用戶界面控件的屬性一般留其初始值時,爲每個屬性存儲一個字段將是對內存的巨大的浪費。 DependencyObject(依賴屬性)解決了僅僅存儲改變了屬性的問題。默認值在依賴屬性中只存儲一次。這只是依賴項屬性的一個好處,還有其餘好處咱們之後再聊。
Visual
WPF程序中的全部可視化元素基本上都是繼承自Visual類,這個類封裝了繪圖指令和附加的繪圖細節(好比透明和裁剪等),若是你不想用WPF的界面元素,更但願使用一個輕量級的繪圖API,那麼你能夠直接對Visual對象進行編程
UIElement
UIElement爲可視元素增長了更多的功能,好比佈局、輸入、焦點、事件、命令等,
FrameworkElement
對UIElement進行了加強,好比UIElement爲佈局機制設置了基礎,但FrameworkElement提供了支持它的重要屬性,如:HorizontalAlignment、Margin等屬性
Panel
是全部佈局元素的基類,全部佈局元素都派生自此類型,它用於放置和排列WPF元素,這個抽象類只包含三個公共屬性:Background、Children、IsItemHost( IsItemHost標誌着控件是否是相似TreeView、ListView這樣的控件)
佈局屬性
佈局容器內的子元素對自身的大小、位置有必定的決定權
子元素能夠設置自身的佈局屬性來調整本身的位置和大小
HorizontalAlignment
水平對齊方式
VerticalAlignment
垂直對其方式
Margin
在元素周圍添加必定的空隙
MinWidth/MinHeight
最小尺寸
MaxWidth/MaxHeight
最大尺寸
Width/Height
尺寸屬性

Grid行與列的尺寸html

若是要顯式的設置Grid的行和列的尺寸,只要設置具體的值便可:
<RowDefinition Height="30"></RowDefinition>
但不少時候須要讓行或者列自適應高度或者寬度,那麼能夠給相應的屬性設置Auto值:
<RowDefinition Height="Auto"></RowDefinition>
還有的時候須要按比例設置行和列的高度或者寬度,那麼可使用*通配符:
<RowDefinition Height="*"></RowDefinition> 
<RowDefinition Height="2*"></RowDefinition>

Grid跨行與跨列編程

當但願Grid內的元素跨越多行或者多列的時候,可使用RowSpan或ColumnSpan來實現
<Button Grid.RowSpan="2" Grid.ColumnSpan="2"></Button>

GridSpliter分割窗口安全

常常有這樣的需求,須要經過拖動的方式改變一個窗口內部區域的大小
GridSpliter能很好的知足這種需求,
在增長一行或一列的大小的同時,減少其餘行或者列的大小(由於一個窗口的區域大小是固定的,此消彼長)
注意HorizontalAlignment屬性必須設置

共享尺寸佈局

假設咱們有兩個Grid,每一個Grid都有兩行,並且兩行的高度都設置爲auto,
咱們但願這兩個Grid的行高保持一致
也就是說某一個grid的行高根據自身的內容變化以後,另外一個grid的行高也跟着變化
以往實現這樣的需求,必定要編寫C#代碼才行,如今咱們可使用WPF的共享尺寸特性來實現這一需求
(你們能夠看到,第二個grid裏的button我沒有設置高度,但它也變高了)

均衡表格UniformGridspa

當你不但願使用Grid複雜的行列設置,只但願把元素「平均」放置到界面上,
那麼你可使用UniformGrid來實現這樣的需求

Z軸順序線程

咱們知道在Canvas佈局容器中,若是位置重疊,後設置的元素會蓋住先設置的元素,
若是想打破這種規定,那麼可使用ZIndex屬性:

修改記錄3d

2014-12-26:編寫前兩部份內容
2014-12-29:修改第二節的內容,增長最後兩節的內容
2014-12-30:完成剩餘的內容
2015-01-05:修改了幾個文字

參考資料orm

《Pro WPF 4.5 in C# 4th Edition》
相關文章
相關標籤/搜索