MEFを使用しているプラグインに基づいたWPFアプリケーションを開発する際に問題が発生しました。
すべてのプラグインは、異なるスタイルと色を含む独自のResourceDictionary
を持つことができます。私の主なアプリケーション(すべてのプラグインをロードする)にすべて異なることを知らせるためにResourceDictionaries
私はすべての辞書のクラスを作成し、[Export(typeof(ResourceDictionary))]
属性でクラスを装飾しました。私の主なアプリケーションでは、その後すべてを輸入ResourceDictionaries
とApplication.Current.Resources.MergedDictionaries
に追加します。これまでのところすべてがうまくいきます。AssemblyShortName以外のものでxamlの現在のアセンブリを参照する
The resource ... could not be resolved.
にもかかわらず:私を悩ませている
唯一のことは、私が順番にDynamicResource
を使用する必要がプラグインのビューのいずれかでリソースを参照するときのようなエラーメッセージを表示するようにVisualStudioをを避けるためということであり、コンパイル時とランタイム時にすべて正常に動作します。 (DynamicResource
呼び出しがStaticResource
通話よりも高価であるため)のみDynamicResource
を使用して、この問題をworkroundする
私はそれらを使用するすべてのプラグインビューでResourceDictionaries
を追加しました:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/resources/ColorDictionary.xaml" />
<ResourceDictionary Source="/resources/StyleDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
を私はパスにそれらを相対参照するため
It can't find the file "resources/StyleDictionary.xaml"
私の主なアプリケーションは、このようなファイルを持っていないので、理解しやすいです:プラグインアセンブリの私は私のメインのアプリケーションでエラーメッセージを取得します。無
<ResourceDictionary Source="/MyAssemblyShortName;component/resources/SymbolDictionary.xaml" />
はこのようにそれをやって:このような現在のプラグインアセンブリのAssemblyShortName
上
<ResourceDictionary Source="/resources/ColorDictionary.xaml" />
I手:
は今、このエラーを回避するために、私が代わりにある解決策を見つけましたエラーが発生し、すべてのリソースが正常にロードされます。しかし、AssemblyShortName
が時間の経過とともに変更された場合(プロジェクトはまだ開発の始めになっています)もしそうなら、私はこのすべての参考文献を見つけて手動で変更する必要があります。
TL; DR /質問:
代わりXAML絶対パスとして現在のアセンブリを参照するAssemblyShortName
を使用する別の方法があります。このため、次
<ResourceDictionary Source="/My.Namespace.PluginAssembly;component/resources/SymbolDictionary.xaml" />
は私にエラーを与える:
Assembly is not referenced by this project.
(もちろん "アセンブリ" は "このプロジェクト" ではないので)
ただ、設計の観点から - なぜメインアプリが直接dependenを持っていませんプラグインのリソース辞書などの項目についてプラグインのアイデアの全体は、アプリケーションのコードを変更することなく、プラグインを使用してアプリケーションの動作を向上させることができるということです。さもなければあなたはそれらを規則的な図書館にして、MEFを捨てるかもしれません。プラグインは、辞書だけでなく、すべてのビューも完全に自己完結している方がよい。 – MickyD
メインアプリケーションの 'ResourceDictionaries'の参照はMEFからカプセル化されています。だから私は新しいプラグインを追加するときに私のメインアプリケーションのコードを変更する必要はありません。また、プラグイン辞書をメインアプリケーションにマージせずに、実行時に各プラグインの辞書から値を使用して参照を見つけることはありません。 – croxy