Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
WPFの機能 †
サポートする機能 †
グラフィック †
- 2D/3Dグラフィック・レンダラー
従来は、2D(図形、ブラシ、ペン)はGDI、3D (光源、カメラ位置情報)はDirect3D、ビデオはDirectShow?など、異なるAPI群を組み合わせていたが、WPFのUIフレームワークでは、これらを統一して扱えるようになっている。また、透過性をサポートしている。
- ベクタ グラフィック
従来のラスタ グラフィックから、画素密度非依存のベクタ グラフィックに変更され、画素密度の変更や、拡大・縮小をしても、画質が維持される。
- GPUレンダリング
CPUによりビットマップ イメージのレンダリングを行っていたGDI, GDI+から、Direct3D経由でGPUを使用するレンダリングに変更されている。このため、CPU描画の他の技術より高速で、同時にCPUへの負担を最小限に抑えることができる。
メディア †
- ドキュメント
- WPFドキュメント(XPSドキュメントやフロー ドキュメント)を表示できる 。
- ドキュメント表示のためのFixedDocument?、FlowDocument?コントロールが標準で提供されている。
- イメージ
- JPEGやGIFなど多様な形式のイメージを表示できる 。
- 静止画を表示するためのImageコントロールが標準で提供されている。
- ビデオ
- WMV、AVI、MPEGなど多様な形式のメディアを表示できる 。
- 動画や音声を再生するためのMediaElement?コントロールが標準で提供されている。
コントロール †
- コントロール種類
Windowsの標準的なUIを実装するために必須である、基本的な組み込みコントロールが提供される。なお、HTMLと同様に、これらのコントロール類をXAMLで実装するため、コントロール単位にXAMLタグが用意されている。
- データ バインディング
UIコントロールと、CLRオブジェクトの間をマッピングする。
- スタイル・テンプレート
UIコントロールの「外観」や、イベント ハンドラ・イベント トリガなども含めた、UIコントロールの標準化・カスタマイズを行う。
レイアウト †
パネルと呼ばれるレイアウト用コントロールを使用して、Windowsフォームのような座標レイアウト、HTMLのようなフロー レイアウト(ブロック化、格子分割)にも対応する。
アニメーション †
イベント トリガ、トリガ アクション、ストーリ ボードを定義することで、UIコントロールなどの表示項目にタイムライン ベースのアニメーションの効果を付加できる。
デプロイ †
ClickOnce、XBAPなどのデプロイが可能。
相互運用性 †
P/InvokeやRCW呼出しなどWin32連携技術を使用した相互運用が可能である。また、WindowsFormsHost?、Hwndhost を使用することで、WindowsフォームやActiveXのUIコントロールを使用することも可能である(パフォーマンス的には不利)。
例えば、下記は、System.Windows.Forms名前空間のDataGrid?コントロールをホストするWPFの例である。
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="HostingWfInWpf" Height="150" Width="300" Loaded="Window_Loaded">
<Canvas>
<WindowsFormsHost Name="windowsFormsHost1" Height="100" Width="275">
<wf:DataGrid x:Name="dataGrid1"/>
</WindowsFormsHost>
</Canvas>
</Window>
- MSDN > Windows Presentation Foundation > 移行と相互運用性
- @IT > Insider.NET > .NET TIPS
機能の制限事項 †
主に3Dグラフィックの高度な機能に関する制限であるので、リッチでインタラクティブな業務アプリケーションの開発に、大きな支障はないと言える。
- パフォーマンス
Direct3Dと比べるとオーバーヘッドがあり、GPU負荷が高くなる。また、WPFはDirect3D 9対応であり、Direct3D 10対応のグラフィックボードであってもパフォーマンスは向上しない。
- シェーダ
- 3Dグラフィックにおいて、グラフィック リソースに対して光源計算、陰影処理とレンダリング(ピクセル化)を実行するために使用するソフトウェア命令の組み合わせ。シェーダには、3Dグラフィックを、2Dグラフィックのように表示するトゥーン シェーダや、毛筆で描かれたような水彩画風の特殊な絵のタッチで表示する筆シェーダなどがある。
- WPFは内部的にシェーダを使用しているが、開発者がWPFからシェーダを使用することはできない。
- スキニング
- 3Dグラフィックにおいて、人間の関節のような滑らかな屈曲を表現するための手法。
- WPFではスキニング ができないので、滑らかな関節を持つアニメーションはできない(剛体アニメーションのみサポート)。
- 環境マッピング
- 3Dグラフィックにおいて、レイトレーシングを使わずに反射率の高い表面をシミュレートするテクニック。オブジェクトを囲むシーンの画像を含む特殊なテクスチャを、オブジェクト自体に適用する。結果、反射面の特徴を上手く模倣し、膨大な計算を必要とするレイトレーシングを使わずに、十分実用的なものになる。
- WPFでは環境マッピング が使用できないので、物体に周囲の景色が反射しているような効果は表現できない。
- 影
- WPFではステンシル バッファ(3Dグラフィックにおいて、物体の重ね合わせなど、描画しなくても良い領域を効率よく判定するためのバッファ領域)や、深度バッファを使用できないためリアルな影を生成できない。
- テクスチャ・フィルタリング
- ポリゴンのテクスチャを構成するピクセルにテクセル(3Dグラフィックにおいて、テクスチャを構成する一つ一つのピクセル)が一対一に対応することはほとんどなく、ポリゴンにテクスチャをマッピングする際には、テクスチャを拡大/縮小(変形)するフィルタが必要となるが、WPFから、このフィルタを指定することはできない。
注意事項 †
- 標準UIコンポーネント
初期は不足があり、サードパーティ製品に依存していたが、最近は拡充された。
- 帳票ビューア
初期はサードパーティ製品に不足があったが、最近は拡充された。
- 座標レイアウト
Windowsフォームの開発と同様に、VSデザイナからコントロールをD&Dして座標レイアウトでコントロール位置を指定する方式の開発を望む場合は、パネル要素に、Canvasコントロール(後述)を使用する。
WPFアーキテクチャ †
クラス階層 †
System.Object
- System.Threading.DispatcherObject?
- System.Windows.DependencyObject?
- System.Windows.Media.Visual
- System.Windows.UIElement
- System.Windows.FrameworkElement?
- System.Windows.Controls.Control
- System.Windows.Controls.ContentControl?
- System.Windows.Controls.ItemsControl?
System.Object †
http://msdn.microsoft.com/ja-jp/library/system.object.aspx
WPFのプログラミング モデルを提供するフレームワークは、CLR上のマネージ コンポーネント(PresentationFramework?.dll、PresentationCore?.dll)として公開される。System.Objectは、マネージ コンポーネントが提供する全てのマネージ クラスの基本クラスであり、型階層のルートである。
マネージ コンポーネントには、開発の生産性と信頼性を高める多数の機能(メモリ管理、エラー処理、共通型システムなど)が用意されているが、性能など犠牲となるものもある。これに対し、アンマネージ コンポーネント(milcore.dll)はDirectXとの緊密な統合の実現(ハードウェア レンダリングおよびソフトウェア レンダリングの効率性を考え、WPF での表示はすべて DirectX エンジンによって実行されるようになっている。)、メモリ・実行の詳細な制御の要件による。
System.Threading.DispatcherObject? †
http://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcherobject.aspx
DispatcherObject?は、派生したCLRオブジェクトに、STAオブジェクトとしての動作を実装する基本抽象クラスである。
通常、WPFアプリケーションは、
- レンダリング スレッド:レンダリングを処理するスレッド
- UIスレッド:アプリケーションの主スレッド(イベント処理、UI処理)
の2つのスレッドを使用して実行される。
「レンダリング スレッド」は、「UIスレッド」がユーザ入力を受け取り、イベント処理・UI処理をしている間に、バック グラウンドで実行される。このため、ほとんどのWPFアプリケーションは、単一の「UIスレッド」で済むが、状況によっては、応答性を高める目的でバック グラウンド スレッドを使用する場合もある。WPFでは、バック グラウンド処理の実装を支援するDispatcherObject?を使用できる。
DispatcherObject?.Invoke、BeginInvoke?メソッドを使用することにより、バック グラウンド処理からの「UI変更処理」(= UI要素の操作処理)が、容易に実装可能となる。
- MSDN > .NET Frameworkクラス ライブラリ
これらのメソッドは、内部的には
- (STAと同様にスレッド間通信の手段である)WindowsメッセージキューにUI変更処理をエンキューする。
- エンキューされた「UI変更処理」は、「UIスレッド」がアイドル状態の際にデキューされて、「UIスレッド」により処理される。
これにより、
- 「UI変更処理」は、必ず、特定の「UIスレッド」により処理されるようになる。
- マルチ スレッド処理においてスレッド セーフではないUIコントロールの変更処理が問題とならなくなる。
System.Windows.DependencyObject? †
System.Windows.Media.Visual †
System.Windows.UIElement †
System.Windows.FrameworkElement? †
System.Windows.Controls.Control †
System.Windows.Controls.ContentControl? †
System.Windows.Controls.ItemsControl? †
要素ツリー †
WPFプロパティ システム †
データ バインディング †
ルーティング イベント †
WPFのコントロール †
標準コントロール †
ユーザ コントロール †