Windows Presentation Foundation

Windows Presentation Foundation（WPF）是美國微軟公司推出.NET Framework 3.0及以後版本的組成部分之一，它是一套基於XML、.NET Framework、向量繪圖技術的展示層開發框架，微軟視其為下一代使用者介面技術，廣泛被用於Windows Vista的界面開發。其早期開發階段的代號為「Avalon」。

WPF使用一種新的XAML（eXtensible Application Markup Language）語言來開發界面。同時WPF自帶MVVM(Model-ViewModel-View)框架,這種設計模式將把界面開發以及後台邏輯很好的分開，降低了耦合度，使使用者界面設計師與程序開發者能更好的合作，降低維護和更新的成本。

WPF/E是WPF的子集合，全名是：Windows Presentation Foundation Everywhere。在基於XAML與JavaScript之下，可跨越各種平台，目前WPF/E已演化為Microsoft Silverlight，擔負微軟在豐富網際網路應用程式領域，並正面與Adobe Flash競爭的產品。

## 特徵

WPF部份之特徵如下：

### 繪圖服務

- 所有的圖形皆可由Direct3D產生。
- 目標在於統一各種顯示圖形。
- Windows可以透過Direct3D來減輕在繪圖任務上的負荷，這項技術乃基於電腦顯示卡的繪圖處理單元（Graphics Processing Unit）。
- 支援向量繪圖（vector graphic）。
- 支援3D透視圖並且影響2D應用程式。

### 佈署

- WPF不僅僅是建立傳統的獨立程式（standalone applications）。其部署方式可分成兩類：standalone與XAML Browser Applications（XBAP）觀點。這些佈署方式在程式的撰寫上大致類似。
- 獨立程式之安裝方式可以藉由ClickOnce或微軟安裝器（MSI）完成。獨立程式可被視為完全信任（full trust）具有完全存取系統資源的優點。
- XAML Browser Application（XBAPs）是一種寄宿於網頁瀏覽器上的程式，像是Internet Explorer。寄宿的程式可取得部份信任（partial trust）的沙箱（sandbox）環境之下，且無法取得完整的系統資源，WPF的功能亦無法完全發揮。寄宿的環境必須有意地防衛惡意的程式碼。從網頁上執行XBAP（讀音"ex-bap"）必須是毫無破綻的（沒有安全性或安裝提示）。雖然這樣的寄宿程式在感觀上與傳統微軟的DLL（out of process）有相異處。

### 互操作性

- WPF可與Win32互相操作：經由主導（hosting）機制，可以在Win32碼之下使用Windows Presentation Foundation，或是在Windows Presentation Foundation環境下使用Win32程式碼。
- Windows Forms的互操作性亦可利用`ElementHost`（繼承自System.Windows.Forms.ContainerControl）以及`WindowsFormsHost`（繼承自System.Windows.Forms.Integration）等類別達成，同時提供了Host Avalon Element的能力。

### 媒體播放

- WPF針對2D圖形提供形狀基元（shape primitives），內建筆刷（brushes）、畫筆（pens）、幾何（geometries），與變形（transforms）。
- WPF以Direct3D提供完整的3D功能。但是，WPF提供更完整的整合性在於使用者介面上（UI）、文件（documents），與媒體（media）。這使得儘可以實現3D UI, 3D文件，和3D媒體。
- 支援了大量的圖片格式（image formats）。
- WPF支援大量影音格式，如：WMV，MPEG以及某些AVI檔。
- WPF支援以時間為基礎的動畫效果，不同於以影格為基礎的處理方式。如此動畫的速度與系統效能就不會有所關連。
- 文件的呈現支援ClearType，這提供一種次像素（sub-pixel）定位功能，強化其自然風格。WPF同時支援OpenType字型樣式。

### 數據綁定

數據綁定是在應用 UI 與其顯示的數據之間建立連接的過程。如果綁定具有正確的設置，並且數據提供適當的通知，則在數據更改其值時，綁定到該數據的元素會自動反映更改。數據綁定還意味著，如果元素中數據的外部表示形式發生更改，則基礎數據可以自動進行更新以反映更改。例如，如果使用者編輯 `TextBox` 元素中的值，則基礎數據值會自動更新以反映該更改。

數據綁定的典型用法是將伺服器或本地配置數據放置到窗體或其他 UI 控制項中。此概念在 WPF 中得到擴展，包括將大量屬性綁定到不同類型的數據源。在 WPF 中，元素的依賴屬性可以綁定到 .NET 對象（包括 ADO.NET 對象或與 Web 服務和 Web 屬性關聯的對象）和 XML 數據。數據綁定的方式一共有四種：

- 通過OneWay綁定，對源屬性的更改會自動更新目標屬性，但對目標屬性的更改不會傳播回源屬性。如果綁定的控制項為隱式只讀，則此類型的綁定適用。例如，可能會綁定到股票行情自動收錄器這樣的源，也可能目標屬性沒有用於進行更改的控制項接口（例如表的數據綁定背景色）。如果無需監視目標屬性的更改，則使用OneWay綁定模式可避免TwoWay綁定模式的系統開銷。
- 通過TwoWay綁定，更改源屬性或目標屬性時會自動更新另一方。此類型的綁定適用於可編輯窗體或其他完全交互式UI方案。大多數屬性默認為OneWay綁定，但某些依賴屬性（通常為使用者可編輯控制項的屬性，例如TextBox.Text和CheckBox.IsChecked）默認為 TwoWay 綁定。用於確定依賴屬性綁定在默認情況下是單向還是雙向的編程方法是：使用 DependencyProperty.GetMetadata獲取屬性元數據，然後檢查FrameworkPropertyMetadata.BindsTwoWayByDefault屬性的布爾值。
- OneWayToSource綁定與OneWay綁定相反；當目標屬性更改時，它會更新源屬性。一個示例方案是只需要從UI重新計算源值的情況。
- OneTime綁定未在圖中顯示，該綁定會使源屬性初始化目標屬性，但不傳播後續更改。如果數據上下文發生更改，或者數據上下文中的對象發生更改，則更改不會在目標屬性中反映。如果適合使用當前狀態的快照或數據實際為靜態數據，則此類型的綁定適合。如果你想使用源屬性中的某個值來初始化目標屬性，且提前不知道數據上下文，則此類型的綁定也有用。此模式實質上是OneWay綁定的一種簡化形式，它在源值不更改的情況下提供更好的性能

數據綁定在展示層並無太大負擔。WPF提供有數據模板（data templates）來控制這些數據。

### 使用者介面

- WPF提供了內建元件控制項集合，包括有按鈕（button）、選單（menu）、列表盒（list box）等。
- WPF的邏輯層與外觀展示層已形成強力的分離模式。
- 元件的外貌樣品可以被完全改寫。

### 文件

對OpenType的支援包括：

- 合字（Ligatures）
- 舊式數碼（Old-style numerals，for example, parts of the glyph hang below the text baseline）
- 花體字（Swash）
- 分數形式（Fractions）
- 上標及下標
- 小型大寫字母

## 工具

在以往Win32應用程式發展時，絕大多數的工作都由開發人員（Developer）來處理，美術設計人員（Designer）可以涉入的相當有限，而且在Win32 API時代，要在使用者介面中實作特效的話，都需要撰寫大量的程式碼才可以做到。

在WPF中，因為大多數的使用者介面元素都可以利用XAML來宣告，因此微軟試著要將Designer和Developer結合在一起，如此可以讓Designer可以充份發揮，並且Developer也不用傷腦筋在外觀設計上，微軟的Designer工具為Microsoft Expression產品集，其中的Expression Blend即為設計WPF應用程式的設計工具，它也可以用來設計Silverlight程式。

開發人員仍然可以使用Visual Studio來開發WPF應用程式，在Visual Studio中內含WPF Designer可供開發人員使用。

## WPF/E

WPF/E發展初期為微軟計畫將WPF推向各平台的計畫，目前此計畫已經被發展成為Silverlight技術。

## WPF應用程式

WPF是下一代圖形API在桌面上的延伸。以WPF撰寫應用程式，具有更高的視覺品質。下表列出微軟自家的產品或是第三協力廠商的主力產品：

- Microsoft Visual Studio 2010
- Microsoft Expression Design
- Microsoft Expression Blend
- Yahoo! Messenger
- New York Times Reader
- Blu
- 騰訊QQ概念版（只能在Windows 7上使用）

## 發行歷史

系列｜版本｜發佈日期｜重要變更／事項｜一同發佈的產品

3｜3.0｜2006年11月

3.5｜2007年11月

3.5 SP1｜2008年8月

4｜4.0｜2010年4月

4.5｜2012年8月

4.5.1｜2013年10月

4.52｜2014年5月

4.6｜2015年7月｜高解析度 (High Dots Per Inch; HDPI) 改善；觸控行為焦點 (Touch) 改善；程式子視窗透明 (Transparent child window) 支援｜Visual Studio 2015

## 外部連結

- - .Net Framework 3.0官方社區
- The Windows Presentation Foundation community portal—The WPF section of the .NET Framework 3.0 community site.
- MSDN Windows Presentation Foundation SDK —Software Development Kit for WPF.
- WPFwiki.org —The largest WPF FAQ question and answer repository & Wiki.
- Getting Started (WPF) —Roadmap to information for developers new to WPF.
- WPF SDK Blog —Active blog maintained by the WPF SDK team.
- Windows Presentation Foundation Unleashed—The first WPF book to market, written by the lead developers Adam Nathan。
- Essential Windows Presentation Foundation —An online WPF tutorial and reference, written by Chris Anderson。
- Microsoft Expression Blend —Visual tool for creating Windows Presentation Foundation applications.
- wpf made simple —Provides info/samples on WPF.
- XAML.net Information on XAML and XBAPs, the Windows Presentation Foundation (WPF), .NET Framework 3.0 and Windows Vista。
- A Guided Tour of Windows Presentation Foundation—Microsoft's overview of Windows Presentation Foundation.
- Windows Presentation Foundation Security Sandbox—An overview of the sandbox in which WPF browser applications run.
- MSDN Forums for Windows Presentation Foundation—Active discussion forum for WPF developers.
- WPF/E Google Group —Discussion group and list of examples.
- Microsoft goes cross-platform with WPF/E—WPF/E explained in an interview with Microsoft's Director of Developer Tools.
- More than meets the eye in Microsoft's plans—News.com's article on WPF/E
- WPF page on NetFXGuide.com
- A Five Mile Overview of WPF—A high-level overview of WPF for software developers.
- xbap.org —Comprehensive information on XBAP applications.
- DirectX 10 Wiki - Wiki covering WPF and DirectX 10 Tutorials, Samples, Effect, News.
- 我用43吋螢幕 各種排版錯誤 - 在高解析度下，WPF的排版會錯誤