WPF佈局容器的繼承機制WPF渲染布局時主要執行了兩個工做:測量和排列測量階段,容器遍歷全部子元素,並詢問子元素所指望的尺寸排列階段,容器在合適的位置放置子元素,並設置元素的最終尺寸這是一個遞歸的過程,界面中任何一個容器元素都會被遍歷到
![]()
DispatcherObjectDependencyObjectWPF應用程序使用單線程親和模型(STA:Single-Thread Affinity),這意味着整個用戶界面都爲單個線程擁有,同時也意味着從另外一個線程與用戶界面元素交互是不安全的,但有不少狀況下須要從其餘線程訪問界面元素,那怎麼辦呢?WPF有一個統一的機制來處理這些問題,這個咱們在後續的章節涉及到以後再深刻講解,你們只要知道,只要繼承DispatcherObject的界面元素就能很方便的處理這些問題就好啦
WPF的屬性的實現機制和Winform程序有很大的差別,Winform控件的屬性不少是經過繼承機制得來的,在你認爲超過90%的用戶界面控件的屬性一般留其初始值時,爲每個屬性存儲一個字段將是對內存的巨大的浪費。 DependencyObject(依賴屬性)解決了僅僅存儲改變了屬性的問題。默認值在依賴屬性中只存儲一次。這只是依賴項屬性的一個好處,還有其餘好處咱們之後再聊。VisualUIElementWPF程序中的全部可視化元素基本上都是繼承自Visual類,這個類封裝了繪圖指令和附加的繪圖細節(好比透明和裁剪等),若是你不想用WPF的界面元素,更但願使用一個輕量級的繪圖API,那麼你能夠直接對Visual對象進行編程
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》