Windows Presentation Foundation慨述

iDotNetSpace發表於2008-01-22
  在過去十年中,我們看到了應用程式開發模型形成了兩個分支 — 傳統的“智慧客戶端”安裝應用程式和基於 Web 的應用程式,兩者都為了在開發界內佔據統治地位而展開競爭。這兩個模型都要求開發人員犧牲在另一個模型中被視為理所當然的功能。Web 應用程式提供了更大的作用範圍、更簡單的部署和簡易性,以彌補狀態的丟失、更為複雜的開發模型以及整合度較低的平臺體驗(儘管最近重新發現了諸如 AJAX 這樣的技術)等缺點。另一方面,Windows 領域使人們開發的應用程式有希望離線工作並充分利用客戶端硬體,但喪失了部署的簡易性以及可用於 Web 應用程式的無數種標記工具支援。能夠提供獨立的、基於瀏覽器的應用程式、簡易的部署、出色的工具支援和深度平臺整合的客戶端應用程式模型具有明顯的作用。

  自從在 Windows 的第一個版本中首次出現以來,構成 Windows 使用者體驗核心的圖形子系統(USER32 和 GDI 庫)實際上已經誕生了將近二十年。當然,隨著時間的推移,USER32 和 GDI 經歷了重大的演變和發展,並且在所有領域都引入了很多新的服務和功能。 同時,還出現了諸如 Direct3D 這樣的新呈現技術,這些技術能夠充分利用在最新的視訊卡中公開的圖形功能。但是,目前的大多數主流應用程式都沒有提供這些圖形卡實現的體驗。

  Windows Presentation Foundation

  Windows Presentation Foundation(以前稱為“Avalon”)是 Windows 中新的關鍵圖形子系統,它為使用者介面、2D 和 3D 圖形、文件和媒體提供了統一的方法。它在 .NET Framework 基礎上生成,並利用 Direct3D 進行基於向量的呈現,為生成所有種類的浸入式應用程式提供了強大的解決方案。另外,Windows Presentation Foundation 通過提供宣告性程式設計模型來實現“工具性”和靈活性,從而使設計人員成為開發過程不可分割的組成部分。

表 1. Windows Presentation Foundation 服務
基本服務 XAML, Property System, Input & Eventing, Accessibility
媒體服務 2D, 3D, Audio, Video, Text, Imaging, Animation, Effects, Composition Engine
文件服務 XPS Documents, Open Packaging Conventions
使用者介面服務 Application Services, Deployment, Controls, Layout, Data Binding
  
  可按照如下方式對 Windows Presentation Foundation 背後的設計原則進行分類:

  ·繼承:Windows Presentation Foundation 提供橫跨表 1 中所標識服務的統一 API。如今的開發人員面臨著無數種不同技術和 API 的選擇,具體取決於他們是面向 2D 圖形(GDI 或 GDI+)、使用者介面(USER32 或 Windows 窗體)、媒體 (DirectShow) 還是 3D(Direct3D 或 OpenGL)。Windows Presentation Foundation 提供了一個與上述所有服務正交的單個模型,並允許將內容無縫地整合到單個應用程式。可使用相同的構造來實現動畫、資料繫結和樣式設定,而無需顧及是面向 2D、3D 還是文字內容。

  ·向量圖形。正如引言所述,Windows Presentation Foundation 充分利用了作為現代 PC 系統的組成部分的強大的圖形處理單元。本質上,組合引擎基於向量,允許對所有輸出進行縮放以便與特定計算機的解析度匹配。呈現體系結構使用 Direct3D 來完成所有輸出:在使用硬體實現 DirectX 7 或更高版本的視訊卡上,Windows Presentation Foundation 儘可能地使用 GPU 來呈現輸出。在無法使用硬體呈現的情況下,可以退而求其次使用軟體呈現。最後,浮點邏輯畫素系統和 32 位 ARGB 顏色支援提供豐富的、預見到未來技術需要(如高 DPI 顯示器)的高保真體驗。

  ·宣告性程式設計。Windows Presentation Foundation 引入 XAML(可擴充套件應用程式標記語言),這是一種基於 XML 的語言,用於例項化和填充巢狀物件層次結構。儘管 XAML 並非專門侷限於 Windows Presentation Foundation,但它本質上是適合於諸如 UI 定義和構建這樣的任務的。XAML 的設計使應用程式可在執行時分析和操縱動態工作流方案的 UI 邏輯。重要的是,Windows Presentation Foundation 中體現的 XAML/程式碼隱藏模型使設計人員和開發人員可使用諸如 Expression“Sparkle”這樣的工具以及第三方專家工具(包括 ZAM 3D 和 Mobiform. Aurora),相互協作來完成客戶端應用程式的設計和開發。

  ·簡易的部署。通過對獨立應用程式和 Web 瀏覽器應用程式的支援,Windows Presentation Foundation 提供兩種部署模型中的最佳模型。Web 瀏覽器應用程式從 Internet Explorer 內部執行 — 佔據整個視窗或在嵌入式框架中。它們提供 Web 應用程式所聞名的易於部署的特點,並且在部分信任的沙箱內操作(沙箱能夠防止客戶端計算機受到惡意應用程式的侵害)。然而,它們仍然可以利用本地客戶端硬體,並使用 3D 和媒體服務獲得目前可以得到的最豐富的 Web 體驗。另一方面,獨立應用程式通過 ClickOnce 或 MSI 技術在本地安裝,並且提供對基礎平臺的完全訪問。

  ·文件生存週期。Windows Presentation Foundation 引入一組新的文件和列印技術。需要將資料永久儲存在本地儲存區的應用程式可以使用 Open Packaging Conventions(開放打包約定)— 這是一種與 Office 12 共享的基於 ZIP 的打包約定,它支援核心屬性和自定義後設資料、數字簽名以及許可權管理功能。對於希望共享文件以便在多臺計算機(即使未安裝相應的應用程式)之間進行協作的應用程式而言,XML Paper Specification(XML 檔案規範)允許以可列印、可移植的格式確立視覺化效果。

  圖1 顯示的體系結構關係圖示識 Windows Presentation Foundation 的主要元件。(請注意,方框的大小不代表各個元件的相對大小或重要性。)


1. Windows Presentation Foundation 體系結構


  在頂層,Presentation Framework 提供了一個託管 API,它提供對基礎功能的完全訪問。絕大多數 Windows Presentation Foundation 開發人員都將專門使用這一層。該框架包含大量標準控制元件(如 Button、Label、Menu);佈局皮膚;2D 和 3D 圖形和文字基元;對影像處理效果、媒體、動畫和文件服務的支援;以及對與 GDI、DirectX 和 Windows 窗體/GDI+ 之間的互操作性的支援。

  Windows Presentation Foundation 的真正主力是可視系統。Windows Presentation Foundation 中的大多數元素都派生自一個 Visual 基類。可視系統組合所有資料併產生螢幕輸出。我們就是在這裡將視訊和音訊、2D、3D 和動畫整合在一起,並提供某些文字佈局服務。位於該體系結構模型較低位置的是組合引擎,它負責在螢幕中呈現一個視覺化樹,並考慮從透明層到視窗區域無效的所有方面。

  Windows Presentation Foundation 中的所有呈現操作均通過 Direct3D 完成(實際上,Windows Vista 硬體徽標程式需要 DirectX 9 的 GPU)。通過將更多的圖形處理操作移動到 GPU 中,我們可以讓 CPU 有能力完成其他工作,從而提高效能,同時改善圖形的質量。然而,這些優點並不侷限於 3D 領域 — 2D 圖形也利用了相同的服務;Windows Presentation Foundation 內部未使用 GDI(除非與舊式元素整合)。對於安裝有 Windows Vista 的計算機而言,新的顯示驅動程式模型提供了優質的輸出,從而使媒體密集型應用程式獲得較高的效能。

  佈局:將元素放到螢幕上

  佈局是任何使用者介面子系統的基礎服務之一,它涉及如何確定元素在視窗中的位置。設計 Windows Presentation Foundation 佈局系統的目的是為靈活的可擴充套件模型提供支援,該模型針對內容進行優化,並且能夠正確地處理資料、樣式和控制元件。

  傳統的應用程式平臺(如 Win32)幾乎沒有佈局的概念:控制元件放置在畫布上的 (x,y) 座標系中,並且開發人員需要手動提供對確定任何元素的原點和尺寸的支援(考慮視窗大小調整和顯示器 DPI 設定)。另一方面,Windows Presentation Foundation 提供多種適合於內容並且在視窗內管理控制元件和專案位置的佈局實現。

  在 Windows Presentation Foundation 中,幾乎可以使用任何元素作為其他元素的宿主。例如,Button 可按如下方式包含影像:

<Window xmlns="http://schemas.microsoft.com/winfx/avalon/2005" >
<Button Width="260" Height="200" >
<Image Source="C:\WINDOWS\Web\Wallpaper\follow.jpg" />
</Button>
</Window>



 

  此外,Windows Presentation Foundation 提供五個佈局皮膚,以便控制和約束子元素的大小和位置:Canvas、DockPanel、StackPanel Grid 和 WrapPanel。

  注 SDK 包含一個用於試驗 XAML 的出色工具,叫做 XamlPad。XamlPad 為編輯的程式碼提供基本的錯誤報告和 WYSIWYG 預覽視窗。

  佈局皮膚

  Canvas 使您可以進行 (x,y) 定位,這與 GDI 和 GDI+ 目前提供的功能類似。您還可以使用附加的屬性來控制項的位置。例如:

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<Canvas Background="silver" Margin="20" LayoutTransform="scale 2">
<Button Canvas.Top="30" Canvas.Left="50">Hello world!</Button>
</Canvas>
</Border>

  這裡,Canvas.Top 和 Canvas.Left 是 Canvas 類中的屬性,應用於 Button 以控制其位置。LayoutTransform. 屬性(它是用來派生所有較高階別類的 FrameworkElement 類的一部分)按照 3.0x 幅度縮放輸出。


  DockPanel 使您在停靠項時無需擔心它們的確切 (x,y) 位置:

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<DockPanel Background="silver" Margin="20" LayoutTransform="scale 2">
<Menu DockPanel.Dock="Top">
<MenuItem Header="File" />
<MenuItem Header="Edit" />
</Menu>
<TreeView>
<TreeViewItem Header="root1">
<TreeViewItem Header="child" />
</TreeViewItem>
<TreeViewItem Header="root2">
</TreeView>
<ListBox>
<ListBoxItem>listBoxItem1</ListBoxItem>
<ListBoxItem>listBoxItem2</ListBoxItem>
</ListBox>
</DockPanel>
</Border>



  StackPanel 提供一個從左至右或從上至下放置內容的堆疊模型。

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<StackPanel rientation="Horizontal" Background="silver" Margin="20" LayoutTransform="scale
2">
<Button Height="30" Margin="5">OK</Button>
<Button Height="30">Cancel</Button>
</StackPanel>
</Border>



  Grid 提供一個允許進行行/網格定位的模型:

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<Grid Background="silver" Margin="20" LayoutTransform="scale 3">
<Button Width="200" Height="60" VerticalAlignment="Bottom" HorizontalAlignment="Right"
Margin="20" >Hello</Button>
</Grid>
</Border>

  在網格中,可設定列和行定義,從而可以設定寬和高。可將上述項設定為絕對值(x 畫素寬),或者在考慮絕對大小調整之後使用星號表示法來分配剩餘的空間。還可以設定一個係數來確定分配該空間的方式。例如:

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<Grid LayoutTransform="scale 3" ShowGridLines="true">
<ColumnDefinition Width="30" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="*" />
<RowDefinition />
<Button Grid.Column="1" Margin="10">Hello world!</Button>
</Grid>
</Border>

  可用 SharedSizeGroup 屬性為多個物件指定共享的大小。例如,可使用該屬性來指定兩個按鈕具有相同的寬度(即使它們通常具有不同的大小範圍)。例如:

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<Grid LayoutTransform="scale 2" ShowGridLines="true" IsSharedSizeScope="true" Height="80">
<ColumnDefinition Width="30" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Buttons" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Buttons" />
<RowDefinition />
<Button Grid.Column="1" Margin="10">OK</Button>
<Button Grid.Column="2" Margin="10">A very long cancel button</Button>
</Grid>
</Border>

  WrapPanel 模型是資源管理器視窗的右側窗格,使您可以處理在當前行已滿之後流入新行中的項。例如:

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
LayoutTransform="scale 2">
<WrapPanel Background="Silver" Margin="10">
<Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button
/> <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button />
<Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button
/> <Button /> <Button /> <Button /> <Button />
</WrapPanel>
</Border>

  皮膚負責其子元素的佈局。它們定義內容的大小和形狀、對齊方式和邊距。皮膚的子元素可以是諸如 TextBox 或 Button 這樣的元素,也可以是另一個皮膚。例如,DockPanel 可以包含 StackPanel。

  項調整大小以適應它們所包含的內容 — 這是一個重要的概念,因為它確保了應用程式的本地化不需要重新校準應用程式佈局(因為不同語言的同一句子 — 例如“Auf Wiedersehen”與“Goodbye”— 具有不同的文字長度)。可用 HorizontalAlignment/VerticalAlignment 屬性應用對齊方式,並且使用 Margin 屬性指定邊距。

  ScrollViewer 提供子元素內容的滾動檢視;如果內容溢位可用的空間,則會顯示一個滾動條並允許使用者在內容區域周圍移動。例如:

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
LayoutTransform="scale 2">
<ScrollViewer>
<TextBlock FontSize="20" TextWrapping="Wrap" FontFamily="Global User Interface">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce posuere volutpat erat.
Praesent imperdiet nibh nec pede. Mauris quis orci. Maecenas luctus, risus tempus
dapibus mollis, magna metus convallis nunc, eget pulvinar eros ipsum consectetuer dui.
</TextBlock>
</ScrollViewer>
</Border>



  ViewBox 具有約束內容的大小以適應父皮膚的相反效果。這就提供了一種自動縮放效果。

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<Viewbox>
<TextBlock FontFamily="Global User Interface">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
</TextBlock>
</Viewbox>
</Border>






  佈局協議是一個遞迴過程,它是某種形式的協商,目的是確保所有元素都基於其請求獲得“公平”數量的空間。首先,將發生一個測量過程,其中,父元素詢問子元素希望自己多大,而子元素用 DesiredSize 進行響應。然後,將發生排列過程,其中,父元素以 ActualSize 屬性的形式告訴子元素它將有多大。在進行計算時,特殊值 Double.PositiveInfinity 意味著“適合於內容”。可通過重寫皮膚的 MeasureOverride 和 ArrangeOverride 元素來處理這一問題。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-157076/,如需轉載,請註明出處,否則將追究法律責任。

相關文章