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

Sta*_*eff 7 .net c# wpf xaml resourcedictionary

在我们的项目中,我们有ResourceDictionary一些看起来像这样的图标:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Canvas x:Key="Icon.Refresh"
            x:Shared="False"
            Width="32"
            Height="32"
            Clip="F1 M 0,0L 32,0L 32,32L 0,32L 0,0">
        <Path .../>
        <Path .../>
        <Path .../>
    </Canvas>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

x:Shared="False"属性是必需的,因为当我在多个视图中使用它时,图标将消失.

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

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

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

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

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

Ana*_*aev 10

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

ResourceDictionary包含与项目x:Shared必须编制.ResourceDictionary不能在松散的XAML中或用于主题.

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

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

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

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

  • 根据最近的经验,请注意:x:Shared不能放置在资源文件中嵌套的ResourceDictionary中(具有正确的构建操作)。我有一个案例,我的`ResourceDictionary`包含另一个带有`x:Key`的字典,该字典被分配给某些控件`Resources`。我必须将`&lt;Image x:Key =“ MyIcon” x:Shared =“ False” ... /&gt;`资源移到外部资源字典中,以避免出现问题。 (2认同)