2017-04-24 7 views
2

MEFを使用しているプラ​​グインに基づいたWPFアプリケーションを開発する際に問題が発生しました。
すべてのプラグインは、異なるスタイルと色を含む独自のResourceDictionaryを持つことができます。私の主なアプリケーション(すべてのプラグインをロードする)にすべて異なることを知らせるためにResourceDictionaries私はすべての辞書のクラスを作成し、[Export(typeof(ResourceDictionary))]属性でクラスを装飾しました。私の主なアプリケーションでは、その後すべてを輸入ResourceDictionariesApplication.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.

(もちろん "アセンブリ" は "このプロジェクト" ではないので)

+2

ただ、設計の観点から - なぜメインアプリが直接dependenを持っていませんプラグインのリソース辞書などの項目についてプラグインのアイデアの全体は、アプリケーションのコードを変更することなく、プラグインを使用してアプリケーションの動作を向上させることができるということです。さもなければあなたはそれらを規則的な図書館にして、MEFを捨てるかもしれません。プラグインは、辞書だけでなく、すべてのビューも完全に自己完結している方がよい。 – MickyD

+0

メインアプリケーションの 'ResourceDictionaries'の参照はMEFからカプセル化されています。だから私は新しいプラグインを追加するときに私のメインアプリケーションのコードを変更する必要はありません。また、プラグイン辞書をメインアプリケーションにマージせずに、実行時に各プラグインの辞書から値を使用して参照を見つけることはありません。 – croxy

答えて

1

Is there another way instead of using the AssemblyShortName to reference the current assembly as an absolute path in XAML.

いいえ、私はしないでくださいそう思う。アセンブリの名前は、パックURIの一部です:https://msdn.microsoft.com/en-us/library/aa970069(v=vs.110).aspx

あなたはすべての参照を見つけると、彼らはあなたがアセンブリの名前を変更した場合、手動であなたが完全にアセンブリの名前を変更しない可能性のいずれかまたはプログラムリソースディクショナリを追加、変更したくない場合は、次の

Set up application resources from code

その後、あなたは簡単に動的にアセンブリ名を取得することができます:

Getting assembly name

+0

'ResourceDictionaries'をプログラム的に設定する際の問題は、XAMLデザイナが(すべてが実行時に再解決されたとしても)参照されたリソースを解決できないというエラーをスローすることです。 'ResourceDictionaries'をプログラムで設定しても、XAMLデザイナーがリソースを見つけられるようにする機会はありますか?私は、関連するものを見つけるために何百ものエラーメッセージを掘り下げたくありません。 – croxy

+0

私は分かりません。 XAMLデザイナーは私の意見ではあまり有用ではありません。私はいつもそれを無効にする:http://blog.spinthemoose.com/2013/03/24/disable-the-xaml-designer-in-visual-studio/。実行時に発生する可能性のあるものはすべて処理できないため、設計上の問題を解決するために多くの時間を費やすことはありません。それはとにかく失敗する運命にある。すべての深刻なWPF開発者はXAMLと.NETプログラミング言語を学ぶ必要があります:)デザイナーのためのデザイナーです。 – mm8

+0

大変ありがとうございました。これまでは、XAMLデザイナーが最初から存在していたので、XAMLデザイナーを非アクティブ化することは決して考えていませんでした。私は本当にそれを必要としたことはありません。私はそれが活性化されるのは純粋な習慣だと思います。私はいくつかの人生の決定を再考しなければならないと思う)。 – croxy

関連する問題