(XAML#05)「リソースを定義したクラス自身で参照する」
引き続きリソースについてのトピックです。リソースは定義したコントロール(ウィンドウ)の内側でのみ参照できると書きましたが、リソースを定義したコントロール自身でも参照できます。しかし、次のように書くことはできません。XAML では、定義は「前方参照」(定義している場所よりも前で参照しようとすること)できないためです。
<Window ...
Title="MainWindow" Height="{StaticResource MyHeight}" Width="{StaticResource MyWidth}">
<Window.Resources>
<system:Double x:Key="MyHeight">325.0</system:Double>
<system:Double x:Key="MyWidth">525.0</system:Double>
</Window.Resources>
...
</Window>
上記のように、プロパティを属性として定義する形式を「属性構文」と言いますが、これに対して <型名.プロパティ名> タグを使う「プロパティ要素構文」という定義方法もあります。このプロパティ要素構文を使って次のように定義しなおすと、前方参照せずにすみます。
<Window ...
Title="MainWindow">
<Window.Resources>
<system:Double x:Key="MyHeight">325.0</system:Double>
<system:Double x:Key="MyWidth">525.0</system:Double>
</Window.Resources>
<!-- -->
<Window.Height>
<StaticResource ResourceKey="MyHeight" />
</Window.Height>
<Window.Width>
<StaticResource ResourceKey="MyWidth" />
</Window.Width>
<Grid>
</Grid>
</Window>
一般的に、属性構文はプロパティ要素構文よりも簡単かつコンパクトにプロパティを定義できますが、記述できる内容に制約が生じることもあります。そのような場合には、プロパティ要素構文を使ってください。
プロパティ要素構文を使うことは、WPF のオブジェクトをプログラムでどのように生成するかを考える際にも役立ちます。タグを使って新しい要素を定義することは、C# プログラムにおいては「new」を使って新しいオブジェクトを生成するのと同じです。プロパティ要素構文を使って、そのオブジェクトのプロパティに値を設定することは、オブジェクトに対して SetValue というメソッドを使い値を設定するということです。