學習WPF WPF布局 了解布局容器

2021-09-06 20:32:57 字數 3967 閱讀 3462

wpf布局工作內部原理

wpf渲染布局時主要執行了兩個工作:測量和排列

測量階段,容器遍歷所有子元素,並詢問子元素所期望的尺寸

排列階段,容器在合適的位置放置子元素,並設定元素的最終尺寸

這是乙個遞迴的過程,介面中任何乙個容器元素都會被遍歷到

wpf布局容器的繼承機制

dispatcherobjectwpf應用程式使用單執行緒親和模型(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行與列的尺寸

如果要顯式的設定grid的行和列的尺寸,只要設定具體的值即可:

但很多時候需要讓行或者列自適應高度或者寬度,那麼可以給相應的屬性設定auto值:

還有的時候需要按比例設定行和列的高度或者寬度,那麼可以使用*萬用字元:

grid跨行與跨列

當希望grid內的元素跨越多行或者多列的時候,可以使用rowspan或columnspan來實現

gridspliter分割視窗

經常有這樣的需求,需要通過拖動的方式改變乙個視窗內部區域的大小

gridspliter能很好的滿足這種需求,

在增加一行或一列的大小的同時,減小其他行或者列的大小(因為乙個視窗的區域大小是固定的,此消彼長)

注意horizontalalignment屬性必須設定

共享尺寸

假設我們有兩個grid,每個grid都有兩行,而且兩行的高度都設定為auto,

我們希望這兩個grid的行高保持一致

也就是說某乙個grid的行高根據自身的內容變化之後,另乙個grid的行高也跟著變化

以往實現這樣的需求,一定要編寫c#**才行,現在我們可以使用wpf的共享尺寸特性來實現這一需求

(大家可以看到,第二個grid裡的button我沒有設定高度,但它也變高了)

均衡**uniformgrid

當你不希望使用grid複雜的行列設定,只希望把元素「平均」放置到介面上,

那麼你可以使用uniformgrid來實現這樣的需求

z軸順序

我們知道在canvas布局容器中,如果位置重疊,後設定的元素會蓋住先設定的元素,

如果想打破這種規定,那麼可以使用zindex屬性:

修改記錄

2014-12-26:編寫前兩部分內容

2014-12-29:修改第二節的內容,增加最後兩節的內容

2014-12-30:完成剩餘的內容

2015-01-05:修改了幾個文字

參考資料

《pro wpf 4.5 in c# 4th edition》

學習WPF WPF布局 初識布局容器

學習wpf wpf布局 初識布局容器 xmlns xmlns x title mainwindow content 按鈕 button content 按鈕 button content 按鈕 button content 按鈕 button content label label content ...

WPF WPF四種布局的簡單區別

一 grid 1 描述 網格,自定義行和列,並通過行列的數量 行高列寬來調整控制項的布局,近似於html中的table。2 特點 1 可以定義任意數量的行和列,非常靈活 2 行的高度和列的寬度可以使用絕對值 相對比例 自動調整的方式進行精確設定,並可以設定最大和最小值。3 內部元素可以設定自己所在的...

了解響應式布局

響應式布局是ethan marcotte在2010年5月份提出的乙個概念,簡而言之,就是乙個 能夠相容多個終端 而不是為每個終端做乙個特定的版本。這個概念是為解決移動網際網路瀏覽而誕生的。響應式布局可以為不同終端的使用者提供更加舒適的介面和更好的使用者體驗,而且隨著目前大螢幕移動裝置的普及,用 大勢...