WPFとSilverlight 3 BetaにあってSilverlight 2にないシリーズ「リソースディクショナリのマージ」

以前の投稿でも取り上げました通り、Silverlight 2のResourceDictionaryクラスにはSourceプロパティとMergedDictionariesプロパティがありませんでした。Silverlight 3 Beta 1では、WPFと同様にこれら2つのプロパティがサポートされるようになったため、リソースディクショナリを外部ファイルとして使用することができるようになりました。


Visual Studioでは、まだ「新しい項目の追加」のテンプレートとしてリソース・ディクショナリが用意されていませんが、Expression Blend 3 Previewでは「New Item」にResource Dictionaryが用意されています。





これを使って、リソースディクショナリを追加し、下記のように記述します。


ResourceDictionary1.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- Resource dictionary entries should be defined here. -->
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
</ResourceDictionary>


MainPage.xaml(デフォルトがPage.xamlから変更になりましたね)は次のように記述します。


MainPage.xaml
<UserControl x:Class="SilverlightApplication1.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Width="300" Height="300">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ResourceDictionary1.xaml"/>
                <ResourceDictionary>
                    <SolidColorBrush x:Key="RedBrush" Color="Red"/>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <Border Background="{StaticResource BlueBrush}"
               BorderBrush="{StaticResource RedBrush}" BorderThickness="50"/>
    </Grid>
</UserControl>


そして忘れてはいけないのは、ResourceDictionary1.xamlファイルのビルドアクションを「Resource」に変更することです。
ビルドアクションは「Page」と「Resource」のどちらでも問題なく参照できます。WPFでは「Page」の場合にはBAMLとして埋め込まれ、「Resource」の場合にはそのままXAMLが埋め込まれるという違いがありますが、Silverlightではどちらの場合でもXAMLで埋め込まれます。





実行すると、WPFと同じ使用方法で外部のリソースディクショナリファイルをマージできていることが確認できます。