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的排版会错误