別のアセンブリのResourceDictionary


245

複数の個別のアプリケーションで使用したいリソースディクショナリファイル(MenuTemplate.xaml、ButtonTemplate.xamlなど)があります。それらをアプリケーションのアセンブリに追加することもできますが、これらのリソースを1つの単一のアセンブリでコンパイルして、アプリケーションがそれを参照するようにするとよいでしょう。

リソースアセンブリがビルドされた後、アプリケーションのApp.xamlでそれをどのように参照できますか?現在、私はResourceDictionary.MergedDictionariesを使用して、個々の辞書ファイルをマージしています。アセンブリにそれらがある場合、それらをxamlでどのように参照できますか?


1
これはやり過ぎかもしれませんが、ここで説明されている手法を使用して、リソースをエクスポート用に準備したい場合があります:alexfeinberg.wordpress.com/2015/08/16/…。これを行う主な利点は、リソースアセンブリの複数のバージョンが同じappdomainにロードされる問題を防ぐことです。
user195275

回答:


352

パックURI構文を確認してください。あなたはこのようなものが欲しい:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

1
YourAssemblyがアプリケーションパス内に含まれていない場合はどうなりますか?
SaneDeveloper 2013

@Engineer Spock:CLRはそれなしではそれを見つけることができません(WPFとは特に関係ありません)。どちらかあなたへのプロービングパスを追加app.configを、またはに添えAppDomain.AssemblyResolveそれがアセンブリを見つけること。
Kent Boogaart 2013

1
YourAssemblyプロジェクトがYourAssemblyを参照する必要があるアプリケーションプロジェクトと同じレベルにある場合、プローブパスを追加する必要がありますか?たとえば、C:\ Solution \ AppProject \およびC:\ Solution \ YourAssemblyProject \
SaneDeveloper 2013

1
@EngineerSpock:これは別の質問です。質問を開いてください。
Kent Boogaart 2013

2
この答えは意味がありません。それに従うためには、すでにそれを行う方法を知っている必要があります!
user1040323

97

例、これを15秒の回答にするために-

「common」という名前のWPFライブラリに「styles.xaml」があり、メインアプリケーションプロジェクトからそれを使用したいとします。

  1. メインプロジェクトから「共通」プロジェクトへの参照を追加する
  2. app.xamlには以下が含まれている必要があります。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

乾杯


2
そして、styles.xamlで定義されたリソースをVisual Studio 2010の[プロパティ]ウィンドウから利用できるようにするにはどうすればよいでしょうか。要素を選択し、[リソースの適用]をクリックすると、そのBackgroundプロパティにSystemColorsのみが表示され、styles.xamlで定義されたものは表示されません。しかし、自分でXAMLにリソース名を入力しても機能するため、正しく参照されます。
xr280xr 2013年

UserControlからResourceDictionaryを参照する場合、それを追加したいだけですが、UserControlとメインウィンドウプロジェクトの両方の場所でアセンブリへの参照を追加する必要があります。そうしないと、ランタイムエラーが発生します。
Andrejs Gasilovs 2017年


16

リソースのみのDLLはオプションです。ただし、アプリケーションを再コンパイルせずにリソースを変更する場合を除いて、これは必ずしも必要ではありません。共通のResourceDictionaryファイルを1つだけにすることもオプションです。リソースの変更頻度などによって異なります。

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MyAssembly-拡張子なしのアセンブリ名のみ

FolderStructureInAssemblyリソースがフォルダー内にある場合は、フォルダー構造を指定します

あなたがこれをしているときは、siteOfOriginを知っている方が良いですについてもします。

WPFは、application:///とsiteoforigin:///の2つの機関をサポートしています。application:///権限は、リソースファイルやコンテンツファイルなど、コンパイル時に認識されるアプリケーションデータファイルを識別します。siteoforigin:///権限は、起点サイトファイルを識別します。各権限の範囲を次の図に示します。

ここに画像の説明を入力してください



4

XAMLの使用:

他のassembly構造がわかっていてresourcesc#コードを使用する場合は、以下のコードを使用します。

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

出力:ResourceDictionary RD1.xamlプロジェクトWpfControlLibrary1StackOverflowAppプロジェクトに使用する場合。

プロジェクトの構造

プロジェクトの構造

リソースディクショナリ: リソースディクショナリ

コード出力:

出力

PS:すべてのResourceDictionaryファイルにはBuild ActionResource」または「Page」が必要です。

C#の使用:

誰かが純粋にc#コードでソリューションを望んでいるなら、私のこのソリューションを見てください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.