我在开发基于使用MEF的插件的WPF应用程序时遇到了问题
每个插件都有自己的ResourceDictionary
,其中包含不同的样式和颜色。为了让我的主应用程序(加载所有插件)了解所有不同的ResourceDictionaries
,我为每个字典创建了一个类,并使用[Export(typeof(ResourceDictionary))]
属性修饰了类。在我的主应用程序中,我然后导入所有导出的ResourceDictionaries
并将其添加到Application.Current.Resources.MergedDictionaries
。到目前为止一切正常
唯一困扰我的是,当在插件的一个视图中引用资源时,我必须使用DynamicResource
以避免VisualStudio显示如下错误消息:
资源......无法解决。
即使在编译时和运行时,一切正常
要解决此问题仅使用DynamicResource
(因为DynamicResource
调用比StaticResource
调用更昂贵)我在每个插件视图中添加ResourceDictionaries
我使用它们:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/resources/ColorDictionary.xaml" />
<ResourceDictionary Source="/resources/StyleDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
现在因为我相对于插件程序集的路径引用它们,我在主应用程序中收到错误消息:
无法找到文件&#34; resources / StyleDictionary.xaml&#34;
这是可以理解的,因为我的主要应用程序没有这样的文件 现在为了避免这个错误,我找到了一个解决方案而不是:
<ResourceDictionary Source="/resources/ColorDictionary.xaml" />
我像这样移交当前插件程序集的AssemblyShortName
:
<ResourceDictionary Source="/MyAssemblyShortName;component/resources/SymbolDictionary.xaml" />
当这样做的时候没有给出错误并且所有资源都得到了很好的加载。但是,如果AssemblyShortName
随着时间的推移而发生变化(项目仍处于开发阶段),该怎么办?如果是这样,我必须找到所有这些参考文献并手动更改。
TL; DR /问题:
是否有另一种方法,而不是使用AssemblyShortName
引用当前程序集作为XAML中的绝对路径。因为:
<ResourceDictionary Source="/My.Namespace.PluginAssembly;component/resources/SymbolDictionary.xaml" />
给我错误:
此项目未引用程序集。
(当然不是因为&#34;汇编&#34;是&#34;这个项目&#34;)
答案 0 :(得分:1)
是否有另一种方法,而不是使用AssemblyShortName将当前程序集作为XAML中的绝对路径引用。
不,我不这么认为。程序集的名称是包URI的一部分:https://msdn.microsoft.com/en-us/library/aa970069(v=vs.110).aspx。
如果您不想查找所有引用并在更改程序集名称时手动修改它们,则可以避免完全更改程序集的名称或以编程方式添加资源字典:
Set up application resources from code
然后您可以轻松地动态获取程序集名称: