226

私は複数の別々のアプリケーションで使用したいリソース辞書ファイル(MenuTemplate.xaml、ButtonTemplate.xamlなど)を持っています。それらをアプリケーションのアセンブリに追加することもできますが、これらのリソースを1つのアセンブリにコンパイルして、自分のアプリケーションで参照するようにした方が適切です。

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


  • これはやり過ぎかもしれませんが、ここで説明されているテクニックを使ってエクスポートのためにあなたのリソースを準備したいかもしれません:alexfeinberg.wordpress.com/2015/08/16/…。これを行う主な利点は、リソースアセンブリの複数のバージョンが同じアプリケーションドメインにロードされることによる問題を防ぐことです。 - user195275

6 답변


329

をチェックパックURI構文。あなたはこのようなものが欲しい:

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


  • YourAssemblyがアプリケーションパス内に含まれていない場合はどうなりますか? - EngineerSpock
  • @Engineer Spock:それならCLRは助けがなければそれを見つけることができませんでした(WPFとは特に関係ありません)。どちらかにプローブパスを追加してください。app.configまたは添付するAppDomain.AssemblyResolveそれはアセンブリを見つけるのを助けるために。 - Kent Boogaart
  • YourAssemblyプロジェクトがYourAssemblyを参照する必要があるアプリケーションプロジェクトと同じレベルにある場合、プロービングパスを追加する必要がありますか?たとえば、C:\ Solution \ AppProject \およびC:\ Solution \ YourAssemblyProject \などです。 - EngineerSpock
  • @EngineerSpock:これは別の質問ですので、開いてください。 - Kent Boogaart
  • この答えは意味がありません。それに従うためには、それを実行する方法を知っている必要があります。 - user1040323

90

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

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

  1. メインプロジェクトから "common"プロジェクトへの参照を追加します
  2. app.xamlには次のものを含める必要があります。

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

乾杯


  • では、styles.xamlで定義されたリソースをVisual Studio 2010の[プロパティ]ウィンドウからどのように利用できるようにするのですか。要素を選択して[リソースの適用]をクリックした場合、そのBackgroundプロパティにはSystemColorsのみが表示され、styles.xamlで定義されているものは表示されません。しかし、XAMLでリソース名を自分で入力してもうまく機能するので、正しく参照されています。 - xr280xr
  • UserControlからResourceDictionaryを参照する場合は、それを追加したいだけです。それから、UserControlとメインウィンドウプロジェクトの両方の場所にアセンブリへの参照を追加する必要があります。それ以外の場合は、ランタイムエラーが発生します。 - Gattuso

33

私は.NET 4.5を使用していますが、これを実行できませんでした...私はWPFカスタムコントロールライブラリを使用していました。これは結局私のために働きました...

<ResourceDictionary Source="/MyAssembly;component/mytheme.xaml" />

ソース: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/11a42336-8d87-4656-91a3-275413d3cc19


16

リソース専用DLLはあなたのためのオプションです。しかし、アプリケーションを再コンパイルせずにリソースを変更したいのでなければ、必ずしも必要ではありません。共通のResourceDictionaryファイルを1つだけ選択することもできます。それはあなたがどのくらい頻繁にリソースを変更するかなどによって異なります

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

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

FolderStructureInAssembly - あなたのリソースが群がっている場合は、フォルダ構造を指定してください

これをしているときそれは知っている方がよいですsiteOfOrigin同様に。

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

enter image description here


5

UWPの場合:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />


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プロジェクト。

プロジェクトの構成

Structure of Projects

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

コード出力:

Output

シモンズ:すべてResourceDictionaryファイルは持っているべきですBuild Action'としてResource'または'Page'。

C#を使う:

誰かが純粋に解決策を望んでいる場合C#コードそれから私に会いなさいこの   溶液。

リンクされた質問


関連する質問

最近の質問