Windows Presentation Foundation

**Windows Presentation Foundation** (**WPF**) はマイクロソフトが開発した、.NET Framework 3.0以降に含まれるユーザインタフェースサブシステムである。開発時のコードネームは*Avalon*であった。

## 概要
WPFは、ユーザインタフェースとロジックを明確に区別する一貫したプログラミングモデルを提供する。
WPFアプリケーションはデスクトップで実行するだけでなくウェブブラウザ上で配置・実行することもできる（ただし類似技術のSilverlightとは違い、Windowsのみがターゲット環境となる）。
WPFによって、ユーザインタフェース、2Dおよび3Dオブジェクトの描画、ベクトルグラフィックス、ラスターグラフィックス、アニメーション、音声および動画の再生などといった表現手法を統一的に利用することができる。WPF以前のWindowsアプリケーション開発では、それらを実現するためにはGDI/GDI+、DirectX Graphics (Direct3D他)、DirectX Audio (DirectSound他)、WindowsマルチメディアAPI、DirectShowといった個別のWindows APIを使って実装しなければならなかった。

.NET Framework 3.0はWindows Vistaにプリインストールされており、Windows XP SP2およびWindows Server 2003でも利用できる。また、Windows 7には.NET Framework 3.5 SP1がプリインストールされている。WPFのバージョン番号は、それが含まれる.NET Frameworkのバージョンと同列に扱われることが多い。例えば.NET 3.0上で動作するものはWPF 3.0、.NET 3.5/3.5 SP1で機能拡張されたものはWPF 3.5、そして.NET 4で機能拡張されたものはWPF 4といった具合である。
なお、Windows 8には.NET 4.5が、Windows 8.1には.NET 4.5.1が、Windows 10には.NET 4.6が、そしてWindows 11には.NET 4.8がプリインストールされており、WPF 4.5以降を標準的に利用できるが、逆に.NET 3.5以前のコンポーネントは標準で有効になっていないため、WPF 3.0/3.5アプリケーションを動作させるためには明示的なインストールが必要である。

## 特徴
次に示すのはWPFの特徴の一部である。

### グラフィックス
全てのグラフィックスはDirect3Dを介して描画される。
また、可能であればGPUによるハードウェアアクセラレーションが使用される。
これにより、高速かつ高度なグラフィックを統一されたインタフェースで実現・利用することができる。
* Direct3Dを通して描画することにより、グラフィックスハードウェア上のGPUに描画処理の一部を任せることが可能になる。これは（GDI/GDI+で問題となっていた）CPUの負荷を軽減することにつながる。
* ベクトルグラフィックスをサポートする。これは損失のない拡大縮小を可能にする。
* 3Dモデルのレンダリングや相互作用をサポートする。`Viewport3D`のようなWPFフレームワーク自体に組み込まれた機能のほか、`D3DImage`のようなDirect3D相互運用性も備えている。
* 高DPI環境に標準対応している (System DPI Aware)。Per-Monitor DPI Awareに関しては、.NET 4.6.2およびWindows 10 Anniversary Update以降の環境で利用可能である。

#### Rendering Tier
WPFではグラフィックスハードウェア（グラフィックスカード/グラフィックスチップ）のDirectX (Direct3D) 対応レベルに応じて、GPUアクセラレーションの有無が決定される。

WPF 3.5までは下記のようになっている。
* Rendering Tier 0: GPUアクセラレーションなし。DirectX 7.0未満。
* Rendering Tier 1: 一部GPUアクセラレーションあり。DirectX 7.0以上、DirectX 9.0未満。
* Rendering Tier 2: ほとんどの機能がGPUアクセラレーションを使う。DirectX 9.0以上（VRAM搭載量120MB以上、頂点シェーダー2.0以上など）。
一方、WPF 4以降は下記のように変更されている。
* Rendering Tier 0: GPUアクセラレーションなし。DirectX 9.0未満。
* Rendering Tier 1: いくつかの機能はGPUアクセラレーションを使う。DirectX 9.0以上。
* Rendering Tier 2: ほとんどの機能がGPUアクセラレーションを使う。DirectX 9.0以上（VRAM搭載量120 MB以上、頂点シェーダー2.0以上など）。

### 印刷
WPFは標準でXPSフォーマット (XPS API) をサポートし、画面に表示されている`UIElement`ツリーをそのまま印刷に使用することができる (WYSIWYG)。なお、WPF同様に、画面描画をGPUアクセラレートする技術にDirect2Dが存在するが、Direct2D 1.0は印刷デバイスへの出力を直接サポートしないので、こちらはGDI/GDI+などを併用する必要がある。Direct2D 1.1ではメタデータ出力による印刷機能が追加されている。

### 配置
WPFは通常のスタンドアローンアプリケーションだけでなく、 (XBAP) として配置することもできる。
* スタンドアローンアプリケーションはClickOnceやMicrosoft Windows Installer (MSI) などのインストーラによってローカルコンピュータ上に配置されるアプリケーションである。
* XAMLブラウザーアプリケーション (XBAP) はInternet Explorerなどのウェブブラウザによってホストされるアプリケーションである。コンピュータリソースへのアクセスやWPFの機能は一部制限される。

### 相互運用性
*WPFはWin32（ネイティブコード）との相互運用機能を提供する。Win32のコード内からWPFを利用する（例：`HwndHost`クラスの合成、アセンブリのCOM公開など）ことも、WPFからWin32のコードを利用する（例：`HwndHost`クラスの継承、`D3DImage`クラスなど）ことも可能である。
*Windows Formsとの相互運用も可能である（`ElementHost`、`WindowsFormsHost`クラス）。
なお、WPFのUI上に配置されたWin32あるいはWindows FormsによるレガシーなUIコントロールの描画に対しては、GPUアクセラレーションが効かない（GDI/GDI+によって描画される）ので注意が必要である。

### マルチメディア
*WPFはブラシ、ペン、幾何図形、変形などの基本的な2Dグラフィックス機能を提供する。
*WPFで提供される3D機能はDirect3Dのサブセットである。しかし、WPFではよりユーザインタフェースなどの要素に密接に利用することができる。これによって3DのUI、文書、メディアなどが可能になる。
*一般的なラスター画像フォーマットをサポートする。
*WMV、MPEG、AVIフォーマットの動画をサポートする。
*時間ベースのアニメーションをサポートする。これはシステムのパフォーマンスに依存せずアニメーションのスピードを一定に保つ。
*ClearTypeを利用したテキストレンダリングをサポートする。また、OpenTypeフォントの機能もサポートする。WPF 4以降はDirectWriteコンポーネントとの統合が図られており、縦方向のClearTypeアンチエイリアスが有効となる。

### データバインディング
WPFは次に示す3種類のデータバインディングをサポートする。
* one time: クライアントはサーバ上のアップデートを無視する。
* one way: クライアントはデータに対して書込み禁止の権限をもつ。
* two way: クライアントは読み込みと書き込み両方の権限をもつ。

### ユーザインタフェース (UI)
WPFのUIはXAMLと呼ばれるXMLベースのマークアップ言語で記述され、対応するイベントハンドラなどをC#あるいはVB.NETなどの.NET系言語で記述することになる（）。これはWPFの強力な利点のひとつであり、ロジックとインターフェイスを完全に切り離すことができる。
* ボタン、メニュー、リストボックスなどといった基本的な組み込みコントロールが提供される。
* UI要素の機能拡張や外観のカスタマイズ（カスタムテンプレートの作成）が、Win32あるいはWindows Formsと比べて容易である。
* XAML拡張構文（Bindingマークアップ拡張）を用いたデータバインディングにより、コードビハインドを記述することなくデータソースもしくはユーザインタフェース変更の反映や連動を実現することもできる。
なお、XAMLを使わずにC#、VB.NET、C++/CLIなどの.NET言語を使い、UIをコードベースで組み立てていくことも可能ではあるが、IDE搭載のXAMLエディターおよびXAMLデザイナーを利用してXAMLベースでUIを記述するほうが直感かつ効率的に階層構造を構築できる。

### 入力
WPFはマウスおよびキーボード入力をサポートするほか、`System.Windows.Controls.InkCanvas`により、スタイラスペンを使用した入力にも対応する。WPF 4以降は、Windows Formsでは標準対応されていないWindowsタッチAPI（マルチタッチ）に対するラッパーを提供する。

## 類似技術
XAMLファミリーとして、いくつかのWPF類似技術がマイクロソフトによって開発されている。
### Silverlight
SilverlightはマイクロソフトによってAdobe Flashの競合技術として開発された。Silverlightは主にブラウザ上での実行を想定しているのに対し、WPFはよりクライアントPC環境に密着したスタンドアローン向け技術である。また、Silverlightで使用される.NET Frameworkは基本的に.NET Compact Frameworkのような機能制限付きサブセットであるが、WPFで使用される.NET FrameworkはWindows PC環境向けのフルセットである点も異なる。

### Windowsストアアプリ
Windows 8/Windows RTにおいて導入されたWindowsストアアプリ（WinRTアプリ、Modern UIアプリケーション）はWPF同様XAMLによってユーザインタフェース要素を記述し、WPFに類似したプログラミングモデルを提供する。C#やVB.NETといったマネージ言語だけでなく、ネイティブ言語（C++）からも利用できることが特徴である。Windows 10においてWindowsストアアプリの後継として導入された、ユニバーサルWindowsプラットフォーム (Universal Windows Platform, UWP) アプリケーションも基本は同様である。

## 関連項目
* Microsoft Silverlight
* Microsoft Visual Studio - 従来からWPFアプリケーションの統合開発環境であったが、Visual Studio 2010ではそれ自体がWPFで実装されるに至っている。
* XAML
* Windowsランタイム
* Windows API
* .NET Framework
* MVVM

## 脚注

## 外部リンク
* WPF とは - Visual Studio (Windows) | Microsoft Docs
* [Windows Presentation Foundation | Microsoft Docs](https://learn.microsoft.com/en-us/previous-versions/aa663326(v=msdn.10))
* Windows Presentation Foundation ホーム
* Msdn フォーラム - Windows Presentation Foundation ( WPF )
* WPF Tutorial.net