ThemeManager では、既存のテーマを元に、一部のコントロールのスタイルのみを変更した拡張テーマを作ることができます。

上記の画像イメージでは、MetroDarkテーマをベースに、WPF標準コントロール Button の背景色と、 Border の背景色を変更しています。

実装方法

拡張テーマとして取り扱うリソースファイルを作成します。下記は、既存MetroDarkテーマのWPF標準コントロールのテーマリソース(MetroDark.MSControls.Core.Implicit.xaml)をマージしたうえで拡張しています。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Sample.Themes">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/InfragisticsWPF4.Themes.MetroDark.v19.1;component/Themes/MetroDark.MSControls.Core.Implicit.xaml" />
    </ResourceDictionary.MergedDictionaries>
    
    <!-- Buttonの背景色を緑に変更 -->
    <Style TargetType="Button" >
        <Setter Property="Background" Value="Green"  />
    </Style>

    <!-- Borderを設定-->
    <Style TargetType="Border">
        <Setter Property="Background" Value="Black"></Setter>
        <Setter Property="BorderBrush" Value="Gray"></Setter>
        <Setter Property="BorderThickness" Value="1"></Setter>
    </Style>
    
</ResourceDictionary>

新規のテーマクラスを作成します。拡張元の MetroDarkTheme を継承して作成します。

public class ExtendedMetroDarkTheme : MetroDarkTheme
{
    protected override void ConfigureControlMappings()
    {
        base.ConfigureControlMappings();

        // MS標準コントロールのテーマ情報を更新
        string assemblyFullName = Assembly.GetExecutingAssembly().FullName;
        Mappings[ControlMappingKeys.MsCoreControls] = ThemeBase.BuildLocationString(assemblyFullName, @"/Themes/ExtendedMetroDark.MsCoreControls.xaml");
    }
}

作成した拡張テーマをテーママネージャーに適応します。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // 拡張テーマを適応
        ThemeManager.ApplicationTheme = new ExtendedMetroDarkTheme();
    }
}

Tagged:

製品について

Ultimate UI for WPF