アドインがアクティブ化されると、その Application.Current が null になることがわかりました。以前は、各ウィンドウにリソースを追加していませんでしたが、すべてのアドイン ライブラリには、リソースを含む App.xaml ファイルが含まれていました。したがって、プロジェクトのコンパイルは成功し、VS WPF Designers は正常に動作し、MEF を (1 つのアプリケーション ドメインで) 使用すると正常に動作しました。しかし、私が言ったように、MAF を試してみると、アドインには Application.Current インスタンスがないため、リソースがまったくありません。
ここで、すべてのアドインがホスト アプリケーションのスタイルを使用するようにするために、コントラクトを作成しました。
public interface IThemeContract : IContract
{
/// <summary>
/// Theme name
/// </summary>
string Name { get; }
/// <summary>
/// Theme description
/// </summary>
string Description { get; }
/// <summary>
/// Array of expected resources dictionaries
/// </summary>
IListContract<string> ResourceDictionaries { get; }
}
ホスト アプリケーションはそのすべてのリソースをシリアル化します。HostAdapter の一部:
System.AddIn.Contract.IListContract<string> IThemeContract.ResourceDictionaries
{
get
{
var list = new List<string>();
foreach (var s in _view.ResourceDictionaries)
{
list.Add(XamlWriter.Save(s));
}
return CollectionAdapters.ToIListContract<string>(list);
}
}
それをアドインに送信します。その後、アドインはそれを逆シリアル化します。AddInAdapter の一部:
public override System.Windows.ResourceDictionary[] ResourceDictionaries
{
get
{
var strings = CollectionAdapters.ToIList<string>(_contract.ResourceDictionaries);
var rds = new List<System.Windows.ResourceDictionary>();
foreach (var s in strings)
{
var output = XamlReader.Parse(s);
if ((output as System.Windows.ResourceDictionary) != null)
rds.Add(output as System.Windows.ResourceDictionary);
}
return rds.ToArray();
}
}
そうすれば、アプリケーションは単一のユニットのように見えます。