WPFでほかのデスクトップテーマを適用する方法

以下の2つのblogを参考にさせていただきました。

http://notstatic.com/archives/56


WPF: Changing control style based on the system theme – Lester's XAML Blog



WPFでは、LunaやRoyaleといったマイクロソフト公式のテーマを簡単に適用させる方法が用意されています。以下にその方法を紹介します。


参照設定で下記の4つのアセンブリを追加します。

  • PresentationFramework.Aero.dll
  • PresentationFramework.Classic.dll
  • PresentationFramework.Luna.dll
  • PresentationFramework.Royale.dll



XAMLコードは下記のように記述します。
XAML

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Theme" Height="300" Width="370"
    >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
 
        <Grid Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.4*"/>
                <ColumnDefinition Width="0.3*"/>
                <ColumnDefinition Width="0.3*"/>
            </Grid.ColumnDefinitions>
            <Grid.Resources>
                <ResourceDictionary Source="/presentationframework.Aero;component/themes/aero.normalcolor.xaml" />
            </Grid.Resources>
            <Button Grid.Column="0" Margin="10">aero.normalcolor</Button>
            <ProgressBar Grid.Column="1" Margin="10" Value="50"/>
            <ScrollBar Grid.Column="2" Orientation="Horizontal"/>
        </Grid>
 
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.4*"/>
                <ColumnDefinition Width="0.3*"/>
                <ColumnDefinition Width="0.3*"/>
            </Grid.ColumnDefinitions>
            <Grid.Resources>
                <ResourceDictionary Source="/presentationframework.Luna;component/themes/luna.normalcolor.xaml" />
            </Grid.Resources>
            <Button Grid.Column="0" Margin="10">luna.normalcolor</Button>
            <ProgressBar Grid.Column="1" Margin="10" Value="50"/>
            <ScrollBar Grid.Column="2" Orientation="Horizontal"/>
        </Grid>
 
        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.4*"/>
                <ColumnDefinition Width="0.3*"/>
                <ColumnDefinition Width="0.3*"/>
            </Grid.ColumnDefinitions>
            <Grid.Resources>
                <ResourceDictionary Source="/presentationframework.Luna;component/themes/luna.homestead.xaml" />
            </Grid.Resources>
            <Button Grid.Column="0" Margin="10">luna.homestead</Button>
            <ProgressBar Grid.Column="1" Margin="10" Value="50"/>
            <ScrollBar Grid.Column="2" Orientation="Horizontal"/>
        </Grid>
 
        <Grid Grid.Row="3">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.4*"/>
                <ColumnDefinition Width="0.3*"/>
                <ColumnDefinition Width="0.3*"/>
            </Grid.ColumnDefinitions>
            <Grid.Resources>
                <ResourceDictionary Source="/presentationframework.Luna;component/themes/luna.metallic.xaml" />
            </Grid.Resources>
            <Button Grid.Column="0" Margin="10">luna.metallic</Button>
            <ProgressBar Grid.Column="1" Margin="10" Value="50"/>
            <ScrollBar Grid.Column="2" Orientation="Horizontal"/>
        </Grid>
 
        <Grid Grid.Row="4">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.4*"/>
                <ColumnDefinition Width="0.3*"/>
                <ColumnDefinition Width="0.3*"/>
            </Grid.ColumnDefinitions>
            <Grid.Resources>
                <ResourceDictionary Source="/presentationframework.Royale;component/themes/royale.normalcolor.xaml" />
            </Grid.Resources>
            <Button Grid.Column="0" Margin="10">royale.normalcolor</Button>
            <ProgressBar Grid.Column="1" Margin="10" Value="50"/>
            <ScrollBar Grid.Column="2" Orientation="Horizontal"/>
        </Grid>
 
        <Grid Grid.Row="5">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.4*"/>
                <ColumnDefinition Width="0.3*"/>
                <ColumnDefinition Width="0.3*"/>
            </Grid.ColumnDefinitions>
            <Grid.Resources>
                <ResourceDictionary Source="/presentationframework.Classic;component/themes/classic.xaml" />
            </Grid.Resources>
            <Button Grid.Column="0" Margin="10">classic</Button>
            <ProgressBar Grid.Column="1" Margin="10" Value="50"/>
            <ScrollBar Grid.Column="2" Orientation="Horizontal"/>
        </Grid>
    </Grid>
</Window>


実行すると、下記のように各テーマが適用された状態のボタンやプログレスバーが描画されます。