c# - 使用其 AssemblyShortName 以外的任何内容引用 xaml 中的当前程序集

标签 c# .net wpf xaml

我在使用 MEF 开发基于插件的 WPF 应用程序时遇到了问题。
每个插件都可以有自己的 ResourceDictionary,其中包括不同的样式和颜色。为了让我的主应用程序(加载所有插件)了解所有不同的 ResourceDictionaries,我为每个字典创建了一个类,并用 [Export(typeof(ResourceDictionary))] 装饰了这个类 属性。然后在我的主应用程序中导入所有导出的 ResourceDictionaries 并将它们添加到 Application.Current.Resources.MergedDictionaries。到目前为止一切正常。
唯一困扰我的是,在插件的一个 View 中引用资源时,我必须使用 DynamicResource 以避免 VisualStudio 显示如下错误消息:

The resource ... could not be resolved.

即使在编译时和运行时一切正常。
为了解决仅使用 DynamicResource 的问题(因为 DynamicResource 调用比 StaticResource 调用更昂贵)我添加了 ResourceDictionaries 在每个插件 View 中我都使用它们:

<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="/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" />

给我错误:

Assembly is not referenced by this project.

(当然不是因为“程序集”是“这个项目”)

最佳答案

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

关于c# - 使用其 AssemblyShortName 以外的任何内容引用 xaml 中的当前程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43586591/

相关文章:

c# - 在 WPF C# 的 ListView 中将项目放入特定索引

c# - System.Runtime.Caching.MemoryCache 是否在同一服务器中跨进程共享

c# - ICustomMarshaler 变长数组

c# - 如何使用反射来检索属性?

.net - 致命执行引擎错误 (7A097706)(80131506)

c# - 给定项目 GUID,如何找到项目的名称/路径?

c# - 我应该为每个模型都有一个封装的 ViewModel 吗?

c# - 如何防止在 WPF 中的可编辑控件中焦点时使用 "Enter"键关闭窗口

c# - 安装 AspNet5RC1 后,无法再在任何以前/新的 MVC 项目中打开 cshtml 文件

mysql - ListView vb net