我是Add-in框架的新手。现在我正在尝试创建返回UserControl的WPF插件(根据https://msdn.microsoft.com/en-us/library/bb909849(v=vs.110).aspx)。
问题在于,当我尝试从addin获取用户控件时,会抛出异常:
第一个例外是“找不到名为''的资源。资源名称区分大小写。”所有资源都存储在单独的库中,当我使用MEF(在MAF之前)执行相同操作时它工作正常
好的,我从UserControl中删除了所有StaticResources,然后我又得到了另一个例外:“{”无法加载文件或程序集'Infralution.Localization.Wpf,PublicKeyToken = 547ccae517a004b5'或其中一个依赖项。 “}”。该lib用于本地化。
注意:所有需要的库与插件
位于同一文件夹中是否未加载addin引用的库?或者我错在哪里?
答案 0 :(得分:0)
我发现当激活插件时,其Application.Current为空。 之前我没有为每个窗口添加资源,但是每个addin lib都包含带有资源的App.xaml文件。因此,项目的编译是成功的,VS WPF设计师工作正常,当我使用MEF(在一个appdomain中)时它工作正常。但是,正如我所说,当我尝试MAF时,addins没有Application.Current实例,所以它根本就没有资源。
现在,为了使每个AddIn都使用主机应用程序的样式,我创建了合同:
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);
}
}
并将其发送到插件;然后addins反序列化它;一段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();
}
}
然后应用程序看起来像一个单元。