Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

WPFのResourceについて簡単にまとめてみた

WPF 4 Unleashed

WPF 4 Unleashed

上記を参考にしつつ。

画像とかのバイナリデータをプロジェクト内に含み入れる時に、リソースに追加して使うのはWindowsフォームでもWPFでも一緒。で、ビルドアクションの中にContentとResourceってのがある。Contentは外部参照だけで、Resourceはリソースディクショナリに登録され、XAMLから参照できる。

<Image Source="images/logo.jpg"/>

みたいな。こういうのは、バイナリリソース(Binary Resource)と呼ばれる。それに対して、ロジカルリソース(Logical Resource)という概念がWPFにはある。

Logical resources, henceforth called resources are new to WPF. In XAML, resources are simply objects stored in an element’s Resource property so that they can be shared by child elements. Just about any object in WPF can be a resource, like a brush, a color, some text, some style etc.

WPF Simplified Part 9: Logical Resources | I.Net

XAMLでは、リソースっていうのはUIElementのResourceという依存プロパティで参照できるもんなんだよ、と。だからどんなWPF上のオブジェクトでもリソースとして参照できるので、論理的なリソース(バイナリと一線を画してる)という区分けをしてる。Styleを使ってスパっと見た目を切り替えたり出来るのもこのおかげだね。

ロジカルリソースへのアクセス

こんな感じでマークアップ拡張で参照する。

<Grid>
     <Grid.Resources>
         <FontStyle x:Key="GridFontStyle">Italic</FontStyle>
     </Grid.Resources>
     <!-- ここね -->
     <RadioButton Content="Some Text" 
       FontStyle="{StaticResource GridFontStyle}" />     
 </Grid>

StaticResource と Dynamic Resource

StaticとDynamicにあるように、リソース元の変更を追跡するかどうかが大きく違う。当然トラックする分だけオーバーロードがある。が、Static ResourceはWindowやPageが読み込まれたら初期化されるのに対し、Dynamic Resourceはそのオブジェクトが実際に利用されるまで初期化されない。

なので、何かのアクションを起こして変動するような相互参照があるリソースを活用してかつリソース自体のオブジェクト容量が少ない場合、ダイナミックの方が適していることもある、と。

そうはいってもDynamicの場合は依存プロパティにしかセットできないので、使い所は限定されそう。StaticはどのプロパティでもOK。

Static ResourceはXAMLで宣言してから出ないと利用できない

上記の例で言うと、例えばGrid.Resourcesの宣言より前にリソースをバインドすることは出来ない。Dynamic Resourceの場合は依存プロパティだからエスカレーションして初期化出来る。