2010年4月12日月曜日

メモ 用語(テンプレート関係)

WPFの仕様を調べたり本を読んだりする上で、
用語が難しいのが一番の障害だと思います。
(私が順にしっかり覚えていっていないだけかもしれませんが。。)

というわけで、自分用の用語集を自分なりの言葉で書いています。
正確ではなかったり、間違っていたり、
他の人にとっては余計にわからなくなるかもしれませんが、あしからず。

データ
ユーザーが入力したりWebから取得したりした情報そのもの

Control
ButtonやListBoxなど。
データを表示したり選択したり、表示を変化させたり、など、『コントロール』するクラス。
多くの場合、.net frameworkで用意されているものを使うが、
カスタムコントロールもある。
※Controlというクラス自体もあるが、ここで説明しているのは
 「なんとかControl」や「Controlなんとか」(ControlTemplateなど)のように使う
 言葉としてのControl

Content
Controlの上に『表示するもの』。
『表示するもの』はデータの場合もあれば、他のControlの場合もある。
ControlにはContentプロパティがありobject型のインスタンスを1つだけ持てる。
複数のContentを持てるControlもあるが、その場合はContentプロパティではなく
ItemsプロパティがContentのリストを表す。

ContentControl
上記で示したような『Contentを1つ取るようなタイプのControl』を示すクラス。
ButtonやListBoxItemなどの具体的なクラスは、このクラスから派生している。

ContentPresenter
Content(=ContentControlクラスが持っているプロパティでobject型)などを、
実行時のデータ型に応じて表示するための仕組みを持つクラス。
Imageだったらそのまま表示したり、テンプレートが指定されていたらそれに従って表示したり、
最悪ToString()した文字列を表示したり、といったことをやってくれる。
具体的にどのように表示方法を決めるのかはエッセンシャルWPFのp.107など参照。
ContentControlはContentPresenterを持ち、
これによってContentプロパティに入っているインスタンスの表示をしている

ContentTemplate
ContentControlの1プロパティ。
Contentの表示用のテンプレートを指定したいときに使う。
ContentTemplateプロパティにはDataTemplateを入れる。

DataTemplate
データはあくまで文字列や数値、またはそれらを含むクラス(主にプログラマが作ったクラス)であり、
UIとしてWindow上にどう描画されるかはわからない。
単純な文字列でさえ、TextBlockという表示要素に格納され、
TextBlockが文字列を表示している。
(特に意識しない場合でもContentPresenterが勝手にやってくれてる)
DetaTemplateは、あるデータがどのようなUI要素(ImageやTextBlock)の組み合わせで
表示されるべきかを決めるもの。
Keyを割り当てておけば、使う場面に応じて、
同じデータを違うテンプレートで表示することができる。

表示ツリー
表示要素は、Windowの上にButtonとTextBlockをおいて、
Buttonの上にはさらにTextBlockがおいてあり、・・・というツリー上になっている。
正確に言えば、

<Button>OK</Button>

とXAMLで書いただけで、
Button→ButtonChrome→ContentPresenter→TextBlock
というツリーができている。このツリーのこと。
Button自体はClickなどのイベントロジックなどボタンの基礎要素であり、
ButtonChromeはButtonの背景イメージであり、
TextBlockはContentPresenterがOKという文字列から判断して生成したもの。
当然OKの部分が文字列ではなかったら、
ContentPresenterはTextBlockじゃないものを生成するかもしれない。

ちなみにこのツリーを作るファクトリがあるが、XAMLで書くときは意識しないでいい。

ControlTemplate
上記のようにControlごとに表示ツリーがある程度決まっているが、
この表示ツリーをカスタマイズするもの。
Button→Ellipse→TextBlock
のように表示ツリーを替えることができる。

Style
Templateがツリー全体をごっそり入れ替えるのに対して、
Styleは一部のプロパティ(たとえばBorderBrushなど)を変更するもの。
Triggerを組み合わせることによって、~したとき色を変える、などができる。

※この文書は公開後も随時更新予定です。

0 件のコメント:

コメントを投稿