在WPF中的外部程序集中使用x:Shared =“False”资源时出错

在我们的项目中,我们有一个ResourceDictionary ,其中包含一些如下所示的图标:

        

需要x:Shared="False"属性,因为当我在多个视图中使用它时,图标会消失。

现在我们想要创建具有相同图标的另一个项目,因此我们决定将它们放在由两个项目引用的库项目中。

但是当我们尝试运行应用程序时,我们总是会收到错误:

命名空间“ http://schemas.microsoft.com/winfx/2006/xaml ”中的共享属性只能在已编译的资源字典中使用。“

但我们无法摆脱x:Shared="False"属性,因为据我所知,它是阻止图标消失的唯一方法。

那么我们可以做什么,通过项目参考和不消失的图标在多个项目上共享图标?

从这个错误判断,我们可以理解x:Shared属性只能用于编译的 ResourceDictionary 。 从MSDN x引用:共享属性

必须编译包含x:Shared项的ResourceDictionary 。 ResourceDictionary不能在松散的XAML中使用或用于主题。

编译的ResourceDictionary是一个Build action来设置Page ,在这种情况下,它在运行时转换为BAML(二进制应用程序标记语言)。 创建新的ResourceDictionary时,通常会默认设置此属性。

BAML就是XAML,它已被解析,标记化并转换为二进制forms,以提高使用XAML文件的性能。 引自Adam Nathan WPF书:

BAML不像微软中间语言(MSIL); 它是一种压缩的声明性格式,加载和解析(并且大小更小)比普通的XAML更快。 BAML基本上是XAML编译过程的实现细节。

因此总是建议在ResourceDictionary检查这个标志,因为如果它将设置Resource ,在内存中将存储未打包的XAML版本,这可能会影响整个WPF应用程序的性能。

我不确定我是否碰到了类似的东西,但这引起了共鸣。 现在学到的建议是改变容器。 使用DrawingImage ,它将包含多个向量,这些向量本身位于共享字典中。

             

然后在容器(如此function区按钮)中将图像作为动态资源 (在运行时绑定)访问: