C#のWPFでDLL内のリソースディクショナリを利用する

複数のプロジェクトで利用できそうなユーザーコントロールはDLLにして共有するのが良さそうです。

WPFのユーザーコントロールやウィンドウはもちろん、リソースディクショナリもDLLで作成し、それを参照して利用する事が出来ます。

  

WPFのユーザーコントロールを含むDLLのプロジェクトを作成する方法については

C#のWPFで共有できそうなウインドウをDLL化する」を参照してください。

  

DLL内のウィンドウやユーザーコントロールを利用する方法については

C#のWPFでDLL内のユーザーコントロールを利用する」を参照してください。

 

 ここではDLLの中にあるリソースディクショナリを利用する方法について解説します。


プロジェクトの参照にDLLを追加

先ずはプロジェクトの参照にDLLを追加しましょう。

 

メニューから「プロジェクト(P)」→「参照の追加(R)...」をクリックします。

同一ソリューション内にDLLのプロジェクトがある場合は、左側のリストから「ソリューション」を選ぶとソリューション内のプロジェクトが一覧表示されます。

DLLのプロジェクトにチェックを入れて「OK」ボタンをクリックしましょう。

 

それ以外の場合は「参照(B)...」ボタンからDLLファイルを指定します。


リソースディクショナリをマージする

以下のサンプルで解説します。

<Window x:Class="WpfTest1.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest1"
        mc:Ignorable="d"
        Title="TestWindow" Height="300" Width="300">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/TestLibrary;component/Dictionary1.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button Style="{StaticResource TestButtonStyle}" />
    </Grid>
</Window>

リソースディクショナリをマージ

12行目が追加したリソースディクショナリです。

<ResourceDictionary.MargedDictionaries>でリソースディクショナリをマージしていきます。

DLL内にあるリソースディクショナリを利用する為にはDLLファイル名を指定する必要があります。

pack://application:,,,/[DLLファイル名];component/」という記述がそれです。

この記述に続けてリソースディクショナリのXAMLファイル名を指定ます。

 

詳細は「https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/app-development/pack-uris-in-wpf」を参照

 

 

この例では「TestLibrary.dll」の中の「Dictionary1.xaml」というリソースディクショナリを利用できるようにしています。

StaticResourceで参照

リソースディクショナリ内の要素を参照する方法はDLL内の場合でも同じです。

StaticResourceでキーを指定して利用します。

 

上記の例では、「Dictionary1.xaml」の中に「<Style x:Key="TestButtonStyle" ・・・」のようにボタン用のスタイルが定義されています。

17行目では x:Key の値を使ってその定義を参照しています。