Silverlight ToolkitのImplicitStyleManager

unfold: Using ImplicitStyleManager and Theme Containers



WPFの場合、コントロール(UI要素)にStyleを適用する方法は、Styleの名前(x:Key 属性 )を各コントロールのStyleプロパティ指定する方法と、StyleのTargetTypeプロパティに適用したいコントロールの型を指定する方法の2種類が存在します。


1.x:Key属性を使用


    <StackPanel>
        <StackPanel.Resources>
            <Style x:Key="MyButtonStyle" TargetType="Button">
                <Setter Property="Foreground" Value="Green" />
            </Style>
        </StackPanel.Resources>
        <Button Content="TargetTypeプロパティを使用" Style="{StaticResource MyButtonStyle}"/>
    </StackPanel>


2.TargetTypeプロパティを使用


    <StackPanel>
        <StackPanel.Resources>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Foreground" Value="Green" />
            </Style>
        </StackPanel.Resources>
        <Button Content="TargetTypeプロパティを使用" />
    </StackPanel>





2番目の方法は、TargetTypeプロパティに指定した型のコントロールすべて*1に適用されるため、たくさんのコントロールに対して同じスタイルを適用させたいという状況*2では非常に便利です。


Silverlightではこの2番目の方法は使えない*3ため、たくさんのコントロールにStyleを適用する場合には非常に面倒くさいといった問題がありました。


Silverlight Toolkitに含まれているImplicitStyleManager(以下、ISM)は、この問題を解決してくれるコンポーネントです。


ISMの使い方はとっても簡単です。まず、参照設定でToolkitのMicrosoft.Windows.Controls.Theming.dllを追加します。そして、下記のように適用させたい階層にImplicitStyleManagerのApplyMode添付プロパティを指定します。


<UserControl x:Class="ImplicitStyleManagerSample.Page"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 
   xmlns:theming="clr-namespace:Microsoft.Windows.Controls.Theming;assembly=Microsoft.Windows.Controls.Theming"
 
   Height="300" Width="300" FontSize="18">
    <StackPanel theming:ImplicitStyleManager.ApplyMode="OneTime">
        <StackPanel.Resources>
            <Style TargetType="Button">
                <Setter Property="Foreground" Value="Green" />
            </Style>
        </StackPanel.Resources>
        <Button Content="ImplicitStyleManagerを使用" />
    </StackPanel>
</UserControl>





ApplyMode添付プロパティの値は、Styleを適用しない"None"、Template適用後に一度だけStyleを適用する"OneTime"、コントロールを動的に追加した際にもStyleの適用が行われる"Auto"の3つがあります。


外部リソースファイルに定義したStyleを使うこともできます。その場合には、ImplicitStyleManagerのResourceDictionaryUri添付プロパティに外部リソースファイルを指定します。その時、外部リソースファイル(下記の例ではMyStyle.xmal)のビルドアクションはコンテンツにすることを忘れないでください。


<StackPanel theming:ImplicitStyleManager.ApplyMode="Auto"
               theming:ImplicitStyleManager.ResourceDictionaryUri="MyStyle.xaml">
    <Button Content="ImplicitStyleManagerを使用" />
</StackPanel>

*1:もちろん定義したリソースの適用範囲において

*2:ほとんどの場合そのような状況と思われる

*3:x:Typeマークアップ拡張機能がない