天天看點

【WPF學習】第五章 了解WPF的布局

  在Windows開發人員設計使用者界面的方式上,WPF布局模型是一個重大改進。在WPF問世之前,Windows開發人員使用刻闆的基于坐标的布局将控件放到正确位置。在WPF中,這種方式雖然可行,但已經極少使用。大多數應用程式将使用類似Web的流(flow)布局;在使用流布局模型時,控件可以擴大,并将其他控件擠到其他位置。開發人員能建立與現實分辨率和視窗大小無關的、在不同的顯示器上正确縮放的使用者界面;當視窗内容發生變化時,界面可調整自身,并且可以自如地處理語言的切換。要利用該系統的優勢,首先需要進一步了解WPF布局模型的基本概念和假設。

一、 WPF布局原則

  WPF視窗隻能包含單個元素。為在WPF視窗中放置多個元素并建立更貼近實用的使用者界面,需要在視窗上放置一個容器,然後再這個容器中添加其他元素。

  在WPF中,布局由您實用的容器來确定。盡管有多個容器可供選擇,但“理想的”WPF視窗需要遵循以下幾條重要原則:

  • 不應顯示設定元素(如控件)的尺寸。元素應當可以改變尺寸以适合它們的内容。例如,當添加更多的文本時按鈕應當能夠擴充。可通過設定最大和最小尺寸來限制可以接受的控件尺寸範圍。
  • 不應使用螢幕坐标指定元素的位置。元素應當由它們的容器根據它們的尺寸、順序以及(可選的)其他特定與具體布局容器的資訊進行排列。如果需要在元素之間添加空白空間,可使用Margin屬性。
  • 布局容器的子元素“共享”可用的空間。如果空間允許,布局容器會根據每個元素的内容盡可能為元素設定更合理得尺寸。它們還會向一個或多個子元素配置設定多餘的空間。
  • 可嵌套的布局容器。典型的使用者界面使用Grid面闆作為開始,Grid面闆是WPF中功能最強大的容器,Grid面闆可包含其他布局容器,包含的這些容器以最小的分組排列元素,比如帶有标題的文本框、清單框中的項、工具欄上的圖示以及一列按鈕等。

  盡管對于這幾條原則而言也有一些例外,但它們反映了WPF的總體設計目标。換句話說,如果建立WPF應用程式時,循環了這些原則,将會建立出更好的、更靈活的使用者界面。如果不遵循這些原則,最終将得到不是很适合WPF的并且難以維護的使用者界面。 

二、布局過程

  WPF布局包括兩個階段:測量(measure)階段和排列(arrange)階段。在測量階段,容器周遊所有子元素,并詢問子元素它們所期望的尺寸。在排列階段,容器在合适的位置放置子元素。

  當然,元素未必總能等到最合适的尺寸——有事容器沒有足夠大的空間以适應所含的元素。在這種情況下,容器為了适應可視化區域的尺寸,就必須剪裁不能滿足要求的元素。在後面可以看到,通常可通過設定最小視窗尺寸來避免這種情況。

三、布局容器

  所有WPF布局容器都是派生自System.Windows.Controls.Panel抽象類的面闆。如下圖所示:

【WPF學習】第五章 了解WPF的布局

  Panel類添加了少量成員,包括三個公有屬性,如下表所示:

表 Panel的公有屬性

【WPF學習】第五章 了解WPF的布局

  就Panel基類本身而言沒有什麼特别的,但他是其它更多特殊類的起點。WPF提供了大量可用于安排布局的繼承自Panel的類。下表列出了其中幾個最基本的類。與所有WPF控件和大多數可視化元素一樣,這些類位于System.Windows.Controls名稱空間裡。

表 核心布局面闆

【WPF學習】第五章 了解WPF的布局

   除這些核心容器外,還有幾個更專業的面闆,在各種控件中都可能遇到它們。這些容器包括專門用于包含特定控件子元素的面闆——如TabPanel面闆(在TabPanel面闆中包含多個頁籤)、ToolbarPanel面闆(工具欄中的多個按鈕)以及ToolbarOverflowPanel面闆(Toolbar控件的溢出菜單中的多個指令)。還有VirtualizingStackPanel面闆,資料綁定清單空間使用該面闆以大幅降低開銷;還有InkCanvas控件,該控件和Canvas控件類似,但該控件支援處理平闆電腦(TabletPC)上的手寫筆(stylus)輸入(例如,根據選擇的模式,InkCanvas控件,盡管這有點違反直覺)。接下來文章會分别介紹核心容器資訊。

作者:Peter Luo

出處:https://www.cnblogs.com/Peter-Luo/

本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,并保留此段聲明,否則保留追究法律責任的權利。