使用除AssemblyShortName之外的任何内容引用xaml中的当前程序集

时间:2017-04-24 11:14:26

标签: c# .net wpf xaml

我在开发基于使用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;)

1 个答案:

答案 0 :(得分:1)

  

是否有另一种方法,而不是使用AssemblyShortName将当前程序集作为XAML中的绝对路径引用。

不,我不这么认为。程序集的名称是包URI的一部分:https://msdn.microsoft.com/en-us/library/aa970069(v=vs.110).aspx

如果您不想查找所有引用并在更改程序集名称时手动修改它们,则可以避免完全更改程序集的名称或以编程方式添加资源字典:

Set up application resources from code

然后您可以轻松地动态获取程序集名称:

Getting assembly name