-
Notifications
You must be signed in to change notification settings - Fork 0
MS_WPFFeatures
- 戻る(WPF)
- WPFの機能
- WPFのアーキテクチャ
- WPFのコントロール
WPFがサポートする機能と、その制限事項を纏める。
従来は、
- 2D(図形、ブラシ、ペン)は GDI(GDI)
- 3D(光源、カメラ位置情報)は Direct3D
- ビデオは DirectShow
など、異なる API 群を組み合わせていたが、
WPFの UI フレームワークでは、これらを統一して扱えるようになっている。
- 従来のラスタ グラフィックから、画素密度非依存のベクタ グラフィックに変更。
- 画素密度の変更や、拡大・縮小をしても、画質が維持される。
補足(高 DPI で効いてくる): この「画素密度非依存」という性質が、
4K / 高 DPI ディスプレイが一般化した現在、WPFの
明確な優位点になっている。
Windows Formsは GDI+ のラスタ描画が基本のため、
高 DPI 対応にはapp.manifestの DPI 認識設定やスケーリング処理の
作り込みが必要になる(.NET Framework 4.7 以降で改善はされた)。
CPU 描画の他の技術より高速で、同時に CPU への負担を最小限に抑えることができる。
- CPU によりビットマップ イメージのレンダリングを行っていた
GDI, GDI+から、 - Direct3D 経由で GPU を使用するレンダリングに変更されている。
透過性をサポートしている。
- WPF ドキュメント(XPS ドキュメントやフロー ドキュメント)を表示できる。
- ドキュメント表示のための
FixedDocument、FlowDocumentコントロールが
標準で提供されている。
- JPEG や GIF など多様な形式のイメージを表示できる。
- 静止画を表示するための
Imageコントロールが標準で提供されている。
- WMV、AVI、MPEG など多様な形式のメディアを表示できる。
- 動画や音声を再生するための
MediaElementコントロールが標準で提供されている。
補足:
MediaElementは内部で Windows Media Player のコーデックに
依存する。このため、コーデックが入っていない環境(Server Core、
Windows Server の既定など)では再生できない。
現在の実務では WebView2 に HTML5<video>を埋める方が
環境差の影響を受けにくい。
- Windows の標準的な UI を実装するために必須である、
基本的な組み込みコントロールが提供される。 - なお、HTML と同様に、これらのコントロール類を XAMLで実装するため、
コントロール単位に XAML タグが用意されている。
UI コントロールと、CLR オブジェクトの間をマッピングする。
UI コントロールの「外観」や、イベント ハンドラ・イベント トリガなども含めた、
UI コントロールの標準化・カスタマイズを行う。
パネルと呼ばれるレイアウト用コントロールを使用して、
Windows フォームのような座標レイアウト、
HTML のようなフロー レイアウト(ブロック化、格子分割)にも対応する。
| パネル | レイアウト |
|---|---|
Grid |
行・列による格子分割。最も多用される |
StackPanel |
縦横に順に積む |
DockPanel |
上下左右に貼り付ける |
WrapPanel |
収まらなければ折り返す |
Canvas |
座標指定(Windows Forms 的な配置) |
イベント トリガ、トリガ アクション、ストーリ ボードを定義することで、
UI コントロールなどの表示項目にタイムライン ベースの
アニメーションの効果を付加できる。
ClickOnce(ClickOnce)、XBAPなどのデプロイが可能。
P/Invoke や RCW 呼出しなど Win32 連携技術を使用した相互運用が可能である
(COMを参照)。
また、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>移行メモ(正誤): 元ページの
Hwndhostは、
正しくはHwndHost(Hが大文字)である。
補足(エアスペース問題):
WindowsFormsHost/HwndHostを使うと、
「エアスペース (airspace) 問題」 に必ず遭遇する。
- ホストされた領域は HWND を持つ別ウィンドウとして描画される。
- このため WPF 側の要素を上に重ねられない
(ポップアップ・メニュー・半透明オーバーレイが下に隠れる)。Z-OrderやOpacityも効かない。段階移行(Windows Forms → WPF)で必ず問題になる点なので、
相互運用は「画面単位で分ける」(同一画面内で混在させない)方針が無難である。
なお、Windows App SDKの XAML Islands も
同じ制約を抱えている。
主に 3D グラフィックの高度な機能に関する制限であるので、
リッチでインタラクティブな業務アプリケーションの開発に、
大きな支障は無いと言える。
| 項番 | 区分 | 説明 |
|---|---|---|
| 1 | パフォーマンス | Direct3D と比べるとオーバーヘッドがあり、GPU 負荷が高くなる。また、WPF は Direct3D 9 対応であり、Direct3D 10 対応のグラフィックボードであってもパフォーマンスは向上しない。 |
| 2 | シェーダ | WPF は内部的にシェーダを使用しているが、開発者が WPF からシェーダを使用することはできない。 |
| 3 | スキニング | WPF ではスキニングができないので、滑らかな関節を持つアニメーションはできない(剛体アニメーションのみサポート)。 |
| 4 | 環境マッピング | WPF では環境マッピングが使用できないので、物体に周囲の景色が反射しているような効果は表現できない。 |
| 5 | 影 | WPF ではステンシル バッファや深度バッファを使用できないためリアルな影を生成できない。 |
| 6 | テクスチャ・フィルタリング | ポリゴンにテクスチャをマッピングする際の拡大/縮小フィルタを WPF から指定することはできない。 |
移行メモ(正誤): 項番 2「開発者が WPF からシェーダを使用することは
できない」は、.NET Framework 3.5 SP1(2008)以降では誤りである。
ShaderEffectクラスにより、ピクセル シェーダ(HLSL、PS 2.0/3.0)を
カスタム エフェクトとして適用できるようになった。
ただし頂点シェーダは使えない(2D エフェクト限定)ため、
3D 表現に関する制約という趣旨自体は残る。
- 3D グラフィックにおいて、グラフィック リソースに対して光源計算、
陰影処理とレンダリング(ピクセル化)を実行するために使用する
ソフトウェア命令の組み合わせ。 - シェーダには、3D グラフィックを 2D グラフィックのように表示する
トゥーン シェーダや、毛筆で描かれたような水彩画風の特殊な絵のタッチで
表示する筆シェーダなどがある。
3D グラフィックにおいて、人間の関節のような滑らかな屈曲を表現するための手法。
- 3D グラフィックにおいて、レイトレーシングを使わずに
反射率の高い表面をシミュレートするテクニック。 - オブジェクトを囲むシーンの画像を含む特殊なテクスチャを、
オブジェクト自体に適用する。 - 結果、反射面の特徴を上手く模倣し、膨大な計算を必要とする
レイトレーシングを使わずに、十分実用的なものになる。
初期は不足があり、サードパーティ製品に依存していたが、最近は拡充された。
初期はサードパーティ製品に不足があったが、最近は拡充された。
Windows フォームの開発と同様に、
Visual Studioデザイナからコントロールを D&D して
座標レイアウトでコントロール位置を指定する方式の開発を望む場合は、
パネル要素に Canvas コントロールを使用する。
補足(
Canvasは避けたい): 「Windows Forms と同じ感覚で作れる」ため
移行時に選ばれがちだが、Canvasは
- ウィンドウのリサイズに追従しない
- 高 DPI / 多言語(文字列長の違い)で崩れる
という問題を抱える。WPF の強みである解像度非依存を
自ら捨てる形になるため、
原則Grid、どうしても必要な箇所だけCanvasとするのが望ましい。
Tags: 移行, .NET開発, UIサブシステム, WPF/Silverlight, XAML
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。