参照元となるプロジェクトの作成
まずは、参照元となる共通プロジェクト「Resources」を作成し、以下のようなファイルを作成します。
Colors.xaml(ResourceDictionary)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Color x:Key="Colors.CommonBackground">LightGray</Color>
<Color x:Key="Colors.CommonForeground">Black</Color>
</ResourceDictionary>
Brushes.xaml(ResourceDictionary)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Styles/Colors.xaml"/>
</ResourceDictionary.MergedDictionaries>
<SolidColorBrush x:Key="Brushes.CommonBackground" Color="{DynamicResource Colors.CommonBackground}"/>
<SolidColorBrush x:Key="Brushes.CommonForeground" Color="{DynamicResource Colors.CommonForeground}"/>
</ResourceDictionary>
また、共通プロジェクトに基底クラスとなる「WindowBase」クラスを作成しました。
WindowBase.cs(WPFカスタムコントロール)
using System.Windows;
namespace Resources
{
public class WindowBase : Window
{
static WindowBase()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(WindowBase), new FrameworkPropertyMetadata(typeof(WindowBase)));
}
}
}
Generic.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Resources">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Styles/Colors.xaml"/>
<ResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Styles/Brushes.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type local:WindowBase}">
<Setter Property="Background" Value="{DynamicResource Brushes.CommonBackground}"/>
<Setter Property="Foreground" Value="{DynamicResource Brushes.CommonForeground}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:WindowBase}">
<Border Background="{TemplateBinding Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
参照するプロジェクトを作成
続いて、起動用プロジェクトを作成していきます。
起動用のプロジェクト「Main」を作成し、共通プロジェクト「Resources」を参照に追加しました。
Mainプロジェクトの初期フォーム「MainWindow」の継承元を、先ほど作成した「Resources.WindowBase」に変更しています。
その後、Mainプロジェクトの「App.xaml」に先ほど作成したResourceDictionaryを追加します。
<Application x:Class="Main.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Main"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Styles/Colors.xaml"/>
<ResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Styles/Brushes.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
フォームを起動すると以下の画面が表示されます。
※文字の表示用にテキストボックスを追加しています。
Resources.Themes.Styles.Colors.xamlで定義した色が表示されています。
それでは、起動用プロジェクトで色を再定義してみましょう。
先ほど編集した「App.xaml」に以下のように追記します。
<Application x:Class="Main.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Main"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Styles/Colors.xaml"/>
<ResourceDictionary Source="pack://application:,,,/Resources;component/Themes/Styles/Brushes.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Color x:Key="Colors.CommonBackground">Blue</Color>
<Color x:Key="Colors.CommonForeground">Red</Color>
</ResourceDictionary>
</Application.Resources>
</Application>
背景色を青、文字色を赤にするようにしました。
それでは起動してみましょう。
指定した通りの色に変更することができました。
このように共通定義したものも同一Keyを指定することで再定義ができます。
今回作成したプロジェクトはGithubにアップロードしました。
以下のURLから確認できます。
https://github.com/jakucho/WPF-ResourceDictionary-Sample1