- 追加された行はこの色です。
- 削除された行はこの色です。
[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]
-[[戻る>WPF]]
* 目次 [#n83520fb]
#contents
*概要 [#q1a484b6]
*WPFの機能 [#i739b5f5]
**サポートする機能 [#t4e8816f]
***グラフィック [#h896dbc6]
-2D/3Dグラフィック・レンダラー~
従来は、2D(図形、ブラシ、ペン)はGDI、3D (光源、カメラ位置情報)はDirect3D、ビデオはDirectShowなど、異なるAPI群を組み合わせていたが、WPFのUIフレームワークでは、これらを統一して扱えるようになっている。また、透過性をサポートしている。
-ベクタ グラフィック~
従来のラスタ グラフィックから、画素密度非依存のベクタ グラフィックに変更され、画素密度の変更や、拡大・縮小をしても、画質が維持される。
--WPF グラフィックス レンダリングの概要~
http://msdn.microsoft.com/ja-jp/library/ms748373.aspx
-GPUレンダリング~
CPUによりビットマップ イメージのレンダリングを行っていた[[GDI, GDI+>GDI]]から、Direct3D経由でGPUを使用するレンダリングに変更されている。このため、CPU描画の他の技術より高速で、同時にCPUへの負担を最小限に抑えることができる。
***メディア [#ae89eda3]
-ドキュメント
--WPFドキュメント(XPSドキュメントやフロー ドキュメント)を表示できる 。
--ドキュメント表示のためのFixedDocument、FlowDocumentコントロールが標準で提供されている。
-イメージ
--JPEGやGIFなど多様な形式のイメージを表示できる 。
--静止画を表示するためのImageコントロールが標準で提供されている。
-ビデオ
--WMV、AVI、MPEGなど多様な形式のメディアを表示できる 。
--動画や音声を再生するためのMediaElementコントロールが標準で提供されている。
***コントロール [#he1818af]
-コントロール種類~
Windowsの標準的なUIを実装するために必須である、基本的な組み込みコントロールが提供される。なお、HTMLと同様に、これらのコントロール類をXAMLで実装するため、コントロール単位にXAMLタグが用意されている。
--Windowsの標準的なUIを実装するために必須である、基本的な組み込みコントロールが提供される。
--なお、HTMLと同様に、これらのコントロール類をXAMLで実装するため、コントロール単位にXAMLタグが用意されている。
-データ バインディング~
UIコントロールと、CLRオブジェクトの間をマッピングする。
-スタイル・テンプレート~
UIコントロールの「外観」や、イベント ハンドラ・イベント トリガなども含めた、UIコントロールの標準化・カスタマイズを行う。
***レイアウト [#t2c0cd22]
パネルと呼ばれるレイアウト用コントロールを使用して、Windowsフォームのような座標レイアウト、HTMLのようなフロー レイアウト(ブロック化、格子分割)にも対応する。
***アニメーション [#r34f5a3d]
イベント トリガ、トリガ アクション、ストーリ ボードを定義することで、UIコントロールなどの表示項目にタイムライン ベースのアニメーションの効果を付加できる。
***デプロイ [#s2a81ed7]
ClickOnce、[[XBAP]]などのデプロイが可能。
***相互運用性 [#x4bb8f7f]
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 > 移行と相互運用性
---Windows フォームと WPF の相互運用性入力アーキテクチャ~
http://msdn.microsoft.com/ja-jp/library/ms742474.aspx
---WindowsFormsHost要素のレイアウトに関する考慮事項~
http://msdn.microsoft.com/ja-jp/library/ms744952.aspx
---チュートリアル:WPFでのWindowsフォーム複合コントロールのホスト~
http://msdn.microsoft.com/ja-jp/library/ms750944.aspx
---チュートリアル:WPFでの、XAMLを使用したWindowsフォーム コントロールのホスト~
http://msdn.microsoft.com/ja-jp/library/ms742875.aspx
---チュートリアル:WPFでのActiveXコントロールのホスト~
http://msdn.microsoft.com/ja-jp/library/ms742735.aspx
--@IT > Insider.NET > .NET TIPS
---WPF/XAMLでWindowsフォームを利用するには?[3.0,3.5,VS2008,C#、VB]~
http://www.atmarkit.co.jp/fdotnet/dotnettips/802winformonwpf/winformonwpf.html
---WindowsFormでWPFコントロールを利用するには?[3.0,3.5,VS2008,C#、VB]~
http://www.atmarkit.co.jp/fdotnet/dotnettips/800wpfonwinform/wpfonwinform.html
**機能の制限事項 [#u458510e]
主に3Dグラフィックの高度な機能に関する制限であるので、リッチでインタラクティブな業務アプリケーションの開発に、大きな支障はないと言える。
-パフォーマンス~
Direct3Dと比べるとオーバーヘッドがあり、GPU負荷が高くなる。また、WPFはDirect3D 9対応であり、Direct3D 10対応のグラフィックボードであってもパフォーマンスは向上しない。
-シェーダ
--3Dグラフィックにおいて、グラフィック リソースに対して光源計算、陰影処理とレンダリング(ピクセル化)を実行するために使用するソフトウェア命令の組み合わせ。シェーダには、3Dグラフィックを、2Dグラフィックのように表示するトゥーン シェーダや、毛筆で描かれたような水彩画風の特殊な絵のタッチで表示する筆シェーダなどがある。
--WPFは内部的にシェーダを使用しているが、開発者がWPFからシェーダを使用することはできない。
-スキニング
--3Dグラフィックにおいて、人間の関節のような滑らかな屈曲を表現するための手法。
--WPFではスキニング ができないので、滑らかな関節を持つアニメーションはできない(剛体アニメーションのみサポート)。
-環境マッピング
--3Dグラフィックにおいて、レイトレーシングを使わずに反射率の高い表面をシミュレートするテクニック。オブジェクトを囲むシーンの画像を含む特殊なテクスチャを、オブジェクト自体に適用する。結果、反射面の特徴を上手く模倣し、膨大な計算を必要とするレイトレーシングを使わずに、十分実用的なものになる。
--WPFでは環境マッピング が使用できないので、物体に周囲の景色が反射しているような効果は表現できない。
-影
--WPFではステンシル バッファ(3Dグラフィックにおいて、物体の重ね合わせなど、描画しなくても良い領域を効率よく判定するためのバッファ領域)や、深度バッファを使用できないためリアルな影を生成できない。
-テクスチャ・フィルタリング
--ポリゴンのテクスチャを構成するピクセルにテクセル(3Dグラフィックにおいて、テクスチャを構成する一つ一つのピクセル)が一対一に対応することはほとんどなく、ポリゴンにテクスチャをマッピングする際には、テクスチャを拡大/縮小(変形)するフィルタが必要となるが、WPFから、このフィルタを指定することはできない。
**注意事項 [#h510ff35]
-標準UIコンポーネント~
初期は不足があり、サードパーティ製品に依存していたが、最近は拡充された。
-帳票ビューア~
初期はサードパーティ製品に不足があったが、最近は拡充された。
-座標レイアウト~
Windowsフォームの開発と同様に、VSデザイナからコントロールをD&Dして座標レイアウトでコントロール位置を指定する方式の開発を望む場合は、パネル要素に、Canvasコントロール(後述)を使用する。
*WPFアーキテクチャ [#ub42debb]
-MSDN > WPFの基礎 > WPFアーキテクチャ
-MSDN > WPFの基礎 > WPFアーキテクチャ~
http://msdn.microsoft.com/ja-jp/library/ms750441.aspx
**クラス階層 [#b319c3db]
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 [#d4af4c32]
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 [#y115b7e3]
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を使用できる。
-MSDN > WPFの基礎 > スレッド モデル~
http://msdn.microsoft.com/ja-jp/library/ms741870.aspx
DispatcherObject.Invoke、BeginInvokeメソッドを使用することにより、バック グラウンド処理からの「UI変更処理」(= UI要素の操作処理)が、容易に実装可能となる。
-MSDNマガジン > 発行物 > WPFのスレッド:Dispatcherを使用して応答性の高いアプリケーションを構築する~
http://msdn.microsoft.com/ja-jp/magazine/cc163328.aspx
-MSDN > .NET Frameworkクラス ライブラリ
--System.Windows.Threading.Dispatcher.Invokeメソッド~
http://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcher.invoke.aspx
>このメソッドに指定されたデリゲートは、同期実行されるため、バック グラウンド スレッドが実行結果を表示する「UI変更処理」に利用することが多い。
--System.Windows.Threading.Dispatcher.BeginInvokeメソッド~
http://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcher.begininvoke.aspx
--System.Windows.Threading.DispatcherPriority列挙体~
http://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcherpriority.aspx
これらのメソッドは、内部的には
-([[STA]]と同様にスレッド間通信の手段である)[[Windowsメッセージキュー>ウィンドウ メッセージ#zdf9603f]]にUI変更処理をエンキューする。
-エンキューされた「UI変更処理」は、「UIスレッド」がアイドル状態の際にデキューされて、「UIスレッド」により処理される。
これにより、
-「UI変更処理」は、必ず、特定の「UIスレッド」により処理されるようになる。
-マルチ スレッド処理においてスレッド セーフではないUIコントロールの変更処理が問題とならなくなる。
***System.Windows.DependencyObject [#ie0208ee]
http://msdn.microsoft.com/ja-jp/library/system.windows.dependencyobject.aspx
DependencyObjectは、派生したCLRオブジェクトに「[[WPFプロパティ システム>#u00b87e5]]」を実装する。
WPFのアーキテクチャの理念は、「メソッドやイベント(コードビハインド)よりも、なるべくXAMLのマークアップによる宣言的プロパティを使用する」ことである。これを実現する「[[WPFプロパティ システム>#u00b87e5]]」を実装するDependencyObjectにより、開発者は多数の宣言的プロパティを使用し、コントロールに開発者の意図を設定できる。このためWPFの開発元は、このXAMLのマークアップによる宣言的プロパティによる制御の範囲を拡大するために、「[[WPFプロパティ システム>#u00b87e5]]」の「依存関係プロパティ」が必要であると判断した。「依存関係プロパティ」は、プロパティの依存関係を把握し、双方向の接続と変更通知を実現する。具体的には、ソースとなるオブジェクトのプロパティの変更が通知された場合(必須ではないが、INotifyPropertyChangedインターフェイスを使用すると、オブジェクトによる変更通知の発行が可能になる。)、ターゲットとなるオブジェクトのプロパティ値を自動的に検証、計算するなど、高度なオブジェクト プロパティ間の接続を実現する。
-MSDN > .NET Frameworkクラス ライブラリ~
System.ComponentModel.INotifyPropertyChangedインターフェイス~
http://msdn.microsoft.com/ja-jp/library/system.componentmodel.inotifypropertychanged.aspx
「依存関係プロパティ」の入力には、次のものがある。
-動的な「リソース」
--「スタイル」
--「テンプレート」
--「アニメーション」
-「データ バインディング」
--「ビュー・モデル オブジェクト」
-「添付プロパティ」~
親子要素のリレーションの値(子要素 → 親要素)を設定する。
-「プロパティ値の継承」~
親子要素のリレーションの値(親要素 → 子要素)を設定する。
***System.Windows.Media.Visual [#s4219d62]
http://msdn.microsoft.com/ja-jp/library/system.windows.media.visual.aspx
Visualは、WPF の中心的な機能である描画をサポートする基本抽象クラスである。
Visualは、マネージ コンポーネントとアンマネージ コンポーネントの2つのサブシステムの接続ポイントであり、Visualで定義されているマネージ データ(描画情報、描画方法など)から、「ビジュアル ツリー」(後述)と呼ばれるツリー構造のアンマネージ データを構成する。これを「レンダリング スレッド」がツリー構造の上から下にスキャンすることによって描画内容をレンダリングする。
-WPF グラフィックス レンダリングの概要~
http://msdn.microsoft.com/ja-jp/library/ms748373.aspx
-出力表示 : 描画内容をレンダリングする。
--クリッピング : CGで、画像の一部を切り抜く。
--変換 : 変換(回転、拡大縮小、傾斜、平行移動)を実行する。
--境界の計算 : ビジュアルの外接する四角形を決定する。
--ヒット テスト : 境界に含まれているかどうかを判定する。
-プロパティの例
--VisualOpacity : 不透明度~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.visual.visualopacity.aspx
--VisualOpacityMask : 不透明マスク~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.visual.visualopacitymask.aspx
--VisualClip : クリッピング(クリップ領域の決定)~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.visual.visualclip.aspx
--VisualTransform : 変換(ビジュアルの変換値)~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.visual.visualtransform.aspx
--VisualEdgemode : 端の描画方法~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.visual.visualedgemode.aspx
-Visualオブジェクトの階層構造
┬Visual
├UIElement
│└FrameworkElement
├ContainerVisual
│├DrawingVisual
│├HostVisual
└Viewport3DVisual
--System.Windows.Media.ContainerVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.containervisual.aspx~
Visualオブジェクトのコレクションのコンテナとして使用される。
--System.Windows.Media.DrawingVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.drawingvisual.aspx~
図形(ベクタ グラフィックス)、イメージ、モニター(ビデオ)、グリフ(テキスト)の描画に使用する描画クラス。レイアウトやイベントの処理を実現しないため軽量で、背景やクリップ アートの描画に適す。また、ContainerVisualクラスから派生するため、Visualオブジェクトのコレクションを格納できる。
--System.Windows.Media.Media3D.Viewport3DVisualクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.media3d.viewport3dvisual.aspx~
2DのVisualオブジェクトとVisual3Dオブジェクト間のブリッジを提供する。Viewport3DVisualでは、Cameraプロパティ(シーンを表示)とViewportプロパティ(投影をサーフェイス上にマップ)を定義する必要がある 。
-Visualオブジェクトの描画コンテンツ~
Visualオブジェクトは、描画コンテンツを格納した下記の4種類のレンダリング データを命令リストとして格納する。また、命令リストを表すオブジェクトとして、DrawingGroupオブジェクト、Drawingオブジェクトがある 。なお、Drawingクラスは基本抽象クラスであり、描画コンテンツの種類(ベクタ グラフィックス、イメージ、モニター、グリフ)に合わせて、様々な派生クラス(GeometryDrawing 、ImageDrawing 、VideoDrawing 、GlyphRunDrawing )がある。
--System.Windows.Media.Drawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.drawing.aspx
--System.Windows.Media.DrawingGroupクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.drawinggroup.aspx
--System.Windows.Media.GeometryDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.geometrydrawing.aspx
--System.Windows.Media.ImageDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.imagedrawing.aspx
--System.Windows.Media.VideoDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.videodrawing.aspx
--System.Windows.Media.GlyphRunDrawingクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.glyphrundrawing.aspx
-MSDN > Windows Presentation Foundation > グラフィックスとマルチメディア
--Drawingオブジェクトの概要~
http://msdn.microsoft.com/ja-jp/library/ms751619.aspx
--方法:GeometryDrawingを作成する~
http://msdn.microsoft.com/ja-jp/library/ms742533.aspx
--方法:ImageDrawingを使用してイメージを描画する~
http://msdn.microsoft.com/ja-jp/library/ms753315.aspx
--方法:VideoDrawingを使用してメディアを再生する~
http://msdn.microsoft.com/ja-jp/library/aa969812.aspx
-Visualオブジェクトの命令リスト
|項番|命令リスト|説明|h
|1|ベクタ グラフィックス&br;(GeometryDrawing)|Geometry、Pen、Brushなどのベクタ グラフィックス データ|
|2|イメージ&br;(ImageDrawing)|デジタル メディア ファイル内の各種イメージ|
|3|モニター&br;(VideoDrawing)|デジタル メディア ファイル内の各種ビデオ|
|4|グリフ&br;(GlyphRunDrawing)|テキストとフォントで表わされるグリフ&br;(特定のフォントにおける文字の物理表現)|
--System.Windows.Media.Geometryクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.geometry.aspx
--System.Windows.Media.Penクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.pen.aspx
--System.Windows.Media.Brushクラス~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.brush.aspx
-レンダリング データのレンダリング~
Visualオブジェクトの描画コンテンツであるベクタ グラフィックスのレンダリング データは、DrawingVisual・DrawingImage オブジェクトのDrawingプロパティに設定されたDrawingGroupオブジェクト内の1つ以上のDrawingオブジェクト、もしくはDrawingオブジェクトのPen・Brushプロパティとして表される。なお、DrawingVisual・DrawingGroupオブジェクトに、DrawingGroup、Drawingオブジェクトを設定するには、DrawingContextオブジェクトを取得して行う。DrawingImageオブジェクトにDrawingGroup、Drawingオブジェクトを設定するには、コンストラクタを使用する。DrawingVisual・DrawingImageオブジェクトが「レンダリング スレッド」によりレンダリングされるとき、DrawingGroupオブジェクトは、自身に設定されているプロパティを次の順に適用する。
++Children
++OpacityMask
++Opacity
++BitmapEffect
++ClipGeometry
++GuidelineSet
++Transform
***System.Windows.UIElement [#de06b271]
http://msdn.microsoft.com/ja-jp/library/system.windows.uielement.aspx
UIElementは、WPFコア レベル実装の基本クラス
-目的~
UIElementは、WPFコア レベル実装の基本クラスで、下記を目的とする。
--派生クラスで、オーバーライドする仮想メソッドを公開する。
--派生クラスで、仮想メソッドをオーバーライドすることによって、中心的なサブシステムを定義する。
---「レイアウト」
---「ルーティング イベント」
--自要素と子要素の「レイアウト」を操作する。
--キーボード、マウス、およびスタイラスなどによる入力操作に~
対する「ルーティング イベント」と、関連するプロパティが含まれる。
-機能
--子要素の「レイアウト」(サイズ指定・配置)
--ユーザ入力への応答、「ルーティング イベント」
--「アニメーション」システムを部分的にサポート
-プロパティの例
--IsEnabled : UI要素の有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.uielement.isenabled.aspx
--Visibility : UI要素の可視性~
http://msdn.microsoft.com/ja-jp/library/system.windows.uielement.visibility.aspx
--AllowDrop : D&Dの有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.uielement.allowdrop.aspx
--Focusable : フォーカスの有効・無効~
http://msdn.microsoft.com/ja-jp/library/system.windows.uielement_properties.aspx
--RenderTransform : 変換(アニメーションや一時効果の追加)~
http://msdn.microsoft.com/ja-jp/library/system.windows.uielement.rendertransform.aspx
***System.Windows.FrameworkElement [#ed372988]
http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.aspx
UIElementに、「レイアウト」、「スタイル」を中心とした機能を追加する基本クラス。
-概要~
FrameworkElementは、UIElementの仮想メンバへ、以下を導入することを目的とする。
--ポリシー・カスタマイズの導入
---「レイアウト」
---動的「リソース」参照
---「スタイル」 : 「テンプレート」は、FrameworkElementではなく、コントロール クラスによって導入される。
---「アニメーション」 : アニメーションは、 UIElementで定義されているが、FrameworkElementでは、FrameworkElement.BeginStoryboardメソッドと、その関連メンバを実装することによって拡張できる。
---「データ バインディング」
--新しいサブシステムの導入
-機能
--追加の「レイアウト」特性の定義
--動的「リソース」参照
---「スタイル」のサポート
---「アニメーション」のサポートの強化
--「データ バインディング」
-プロパティの例
--Style : 使用されるスタイル~
http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.style.aspx
--UseLayoutRounding : サイズと位置の丸め要・否~
http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.uselayoutrounding.aspx
--LayoutTransform : 変換(回転、拡大縮小、傾斜、平行移動)~
http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.uselayoutrounding.aspx
***System.Windows.Controls.Control [#p2c5df5e]
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.control.aspx
「テンプレート」を使用して外観を定義する UI 要素の基本クラス
Controlの最も重要な機能は、「テンプレート」である。この「テンプレート」により、コントロールの「外観」を宣言型マークアップでカスタマイズ可能になる(「テンプレート」を複数の子要素から構成する)。また、「イベント ハンドラ」や「イベント トリガ」などもこの「テンプレート」により定義可能で、「テンプレート」を「スタイル」化することで、任意の型のコントロールに、これらの「テンプレート」の定義の適用を強制できる。
***System.Windows.Controls.ContentControl [#e85cfa8d]
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.contentcontrol.aspx
ContentControl は、Contentプロパティを持つコントロールであるContentControlも、Contentプロパティの表示に特化した「テンプレート」を持つ。Contentプロパティには、文字列に限らず、様々な子要素を1つだけ設定可能である。代表的なContentControl型の(ContentControlクラスから派生した)コントロールには、Button、CheckBox、RadioButtonなどがある。なお、プロパティへ子要素を設定するXAML構文を、
-「プロパティ属性構文」
-「プロパティ要素構文」
と呼び、この中で、特にContentプロパティに子要素を設定するXAML構文を「コンテンツ構文」と呼ぶ。
***System.Windows.Controls.ItemsControl [#j79a4288]
ItemsControlは、1つのコンテンツを設定するContentControlに対し、複数のコンテンツを設定できるItemsコレクション プロパティを持つコントロールである。ItemsControlも、Itemsコレクション プロパティの表示に特化した「テンプレート」を持つ。Itemsコレクション プロパティには、様々な子要素を複数設定可能である。代表的なItemsControl型の(ItemsControlクラスから派生した)コントロールには、ComboBox、ListBox、TabControl、TreeViewなどがある。なお、同様にItemsコレクション プロパティに子要素を設定するXAML構文を「コンテンツ構文」と呼ぶ。
**要素ツリー [#p05c4c4f]
WPFは、ビジュアル要素や、CLRオブジェクトによる「要素ツリー」を構築して、それを処理することでディスプレイへの表示を行う。
「要素ツリー」は、XAMLやプログラムにより、構築される。
-MSDN > Windows Presentation Foundation > 方法 : 要素を動的に追加する~
http://msdn.microsoft.com/ja-jp/library/ms752374.aspx
例えばXAMLは、次の「プロパティ要素構文」の暗黙的、または明示的な記述で、ツリー構造のCLRオブジェクトをインスタンス化する。
-DockPanel.Children(Panel.Children)プロパティ
-ListBox.Items(ItemsControl.Items)プロパティ
<DockPanel>
<!--implicit: <DockPanel.Children>--> → プロパティ要素構文(省略可能)
<ListBox DockPanel.Dock="Top">
<!--implicit: <ListBox.Items>--> → プロパティ要素構文(省略可能)
<ListBoxItem>
<TextBlock>Dog</TextBlock>
</ListBoxItem>
<ListBoxItem>
<TextBlock>Cat</TextBlock>
</ListBoxItem>
<ListBoxItem>
<TextBlock>Fish</TextBlock>
</ListBoxItem>
<!--implicit: </ListBox.Items>--> → プロパティ要素構文(省略可能)
</ListBox>
<Button Height="20" Width="100" DockPanel.Dock="Top">Buy a Pet</Button>
<!--implicit: </DockPanel.Children>--> → プロパティ要素構文(省略可能)
</DockPanel>
ただし、「要素ツリー」は、実体そのものではない「メタファ」であるため、XML DOM のようなXMLツリー操作用のAPIを使用して直接操作することはない。これは、WPFのUIサブシステムのアーキテクチャ、UIフレームワークの構造を理解する上で役立つ。「要素ツリー」には、「論理ツリー」・「ビジュアル ツリー」の2つの解釈方法がある。
-MSDN > WPFの基礎 > WPFのツリー~
http://msdn.microsoft.com/ja-jp/library/ms753391.aspx
***論理ツリー [#ofdb8805]
「論理ツリー」は、CLRオブジェクトの要素のツリーを表し、「プロパティ継承」や、「ルーティング イベント」を理解する上で役立つ。
以下のXAMLとコードは、同じ「論理ツリー」(CLRオブジェクトの要素のツリー)を生成するため、同じUIを表示する。
-XAML
<DockPanel>
<ListBox Width="100">
<ListBoxItem>Dog</ListBoxItem>
<ListBoxItem>Cat</ListBoxItem>
<ListBoxItem>Fish</ListBoxItem>
</ListBox>
<Button Click="OnClick">OK</Button>
</DockPanel>
-コード
DockPanel dp = new DockPanel();
ListBox lbx = new ListBox();
lbx.Width = 100;
ListBoxItem lbxItem = null;
lbxItem = new ListBoxItem();
lbxItem.Content = "Dog";
lbx.Items.Add(lbxItem);
lbxItem = new ListBoxItem();
lbxItem.Content = "Cat";
lbx.Items.Add(lbxItem);
lbxItem = new ListBoxItem();
lbxItem.Content = "Fish";
lbx.Items.Add(lbxItem);
dp.Children.Add(lbx);
Button btn = new Button();
btn.Content = "OK";
btn.Click += new RoutedEventHandler(this.OnClick);
dp.Children.Add(btn);
this.AddChild(dp);
***ビジュアル ツリー [#o813f26f]
「ビジュアル ツリー」は、「論理ツリー」と異なり、ビジュアル要素のツリーを表し、コントロールの「テンプレート」が展開される。このため、アプリケーションのUIで使用する、全てのVisualオブジェクト(描画内容)が含まれる。
-レンダリング順序~
「ビジュアル ツリー」階層の最上位の要素(ルート ビジュアル)から、左から右に幅優先で走査・レンダリングされる。
-ルート ビジュアル~
ルート ビジュアルは、「ビジュアル ツリー」階層の最上位の要素で、ほとんどのアプリケーションでは、ルート ビジュアルは以下のいずれかになる。
--Window : 「Window画面」
--NavigationWindow : 「ナビゲーション フレームワーク」
--Win32アプリケーションにホストされる場合、Win32ウィンドウにホストされる最上位のビジュアル要素がルート ビジュアルになる。
>MSDN > Windows Presentation Foundation > チュートリアル:~
Win32アプリケーションでのビジュアル オブジェクトのホスト~
http://msdn.microsoft.com/ja-jp/library/ms754039.aspx
***論理ツリーと、ビジュアル ツリーの確認方法 [#k6ab5976]
実際に、「要素ツリー」の内容を確認したい場合は、以下のヘルパ クラスのGetChildrenメソッドを再帰的に使用して、各ツリーを出力すると良い。
-LogicalTreeHelper:「論理ツリー」の子要素を照会~
http://msdn.microsoft.com/ja-jp/library/system.windows.logicaltreehelper.aspx
-VisualTreeHelper:「ビジュアル ツリー」の子要素を照会~
http://msdn.microsoft.com/ja-jp/library/system.windows.media.visualtreehelper.aspx
上記のヘルパ クラスの使用例を、サンプルコードとして以下に示す。
-LogicalTreeHelperを使用する場合は、以下のPrintLogicalTreeメソッドを実行する。
private void PrintLogicalTree() {
Debug.WriteLine("PrintLogicalTree");
PrintLogicalTree(0, this);
}
// 論理ツリーを出力する。
// DependencyObjectの場合は、子要素も再帰的に表示する
private void PrintLogicalTree(int level, DependencyObject obj) {
PrintObject(level, obj);
foreach (var child in LogicalTreeHelper.GetChildren(obj)) {
if (child is DependencyObject) {
PrintLogicalTree(level + 1, (DependencyObject)child);
}
else {
PrintObject(level + 1, child);
}
}
}
-VisualTreeHelperを使用する場合は、以下のPrintVisualTreeメソッドを実行する。
private void PrintVisualTree() {
Debug.WriteLine("PrintVisualTree");
PrintVisualTree(0, this);
}
// ビジュアル ツリーを表示する。
// DependencyObjectの場合はビジュアル ツリー上の子要素も再帰的に出力していく
private void PrintVisualTree(int level, DependencyObject obj) {
PrintObject(level, obj);
foreach (var child in GetVisualChildren(obj)) {
if (child is DependencyObject) {
PrintVisualTree(level + 1, (DependencyObject)child);
}
else {
PrintObject(level + 1, child);
}
}
}
// ビジュアル ツリーの子要素の列挙を返す
private IEnumerable<object> GetVisualChildren(DependencyObject obj) {
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) {
yield return VisualTreeHelper.GetChild(obj, i);
}
}
// ToStringの結果をインデントつきで出力
private void PrintObject(int level, object obj) {
Debug.WriteLine(new string('\t', level) + obj);
}
**WPFプロパティ システム [#u00b87e5]
本項では、DependencyObjectにより実装される「WPFプロパティ システム」の
-「依存関係プロパティ」
-「添付プロパティ」
-「プロパティ値の継承」
について説明する。
なお、それぞれのプロパティの定義方法などについても触れるが、実際にこれらのプロパティを独自に定義する必要がある場合は、カスタム コントロール作成時にあたる 。
-MSDN > Windows Presentation Foundation~
コントロール > コントロールのカスタマイズ > コントロールの作成の概要~
http://msdn.microsoft.com/ja-jp/library/ms745025.aspx
***依存関係プロパティ [#y0f446a9]
「依存関係プロパティ」は、「WPFプロパティ システム」によってサポートされるプロパティで、WPFに管理される一種の辞書構造を用いて値を保持する。「依存関係プロパティ」では、変更監視・有効値検証などの機能が使用可能である。
-MSDN > WPFの基礎 > プロパティ > 依存関係プロパティの概要~
http://msdn.microsoft.com/ja-jp/library/ms752914.aspx
-用途~
「依存関係プロパティ」は、下記で使用されている。
--動的な「リソース」参照
---「スタイル」
---「アニメーション」
--「データ バインディング」
--「添付プロパティ」
--「プロパティ値の継承」
-定義~
「依存関係プロパティ」は、一般的なプロパティであるCLRプロパティのように定義するのではなく、「WPFプロパティ システム」に対し「依存関係プロパティ」として登録する必要がある。
--定義方法~
以下、「依存関係プロパティ」の定義方法について説明する。
---public static readonly(VBでは、Public Shared ReadOnly)なDependencyProperty型の変数として宣言する。
---「依存関係プロパティ」名の末尾に「Property」を付与する(WPFの名称付与基準)
---変数宣言時か、静的コンストラクタを初期化する。~
DependencyProperty.Register メソッドを使用し「依存関係プロパティ」として「WPFプロパティ システム」に登録する。~
http://msdn.microsoft.com/ja-jp/library/system.windows.dependencyproperty.register.aspx
---「依存関係プロパティ」は、プロパティの設定・取得方法が特殊なので、~
CLRプロパティでラップし、プロパティにアクセスし易いようにする。
***添付プロパティ [#bb2645d8]
**データ バインディング [#dac6f2bf]
**ルーティング イベント [#m1474b2f]
*WPFのコントロール [#zc4549e3]
**標準コントロール [#te4c8df4]
**ユーザ コントロール [#m9448a6a]