使用x时出错:共享="错误" WPF中外部程序集中的资源

时间:2014-02-27 11:11:23

标签: c# .net 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>

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

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

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

  

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

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

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

4 个答案:

答案 0 :(得分:10)

根据此错误判断,我们可以理解x:Shared属性只能用于已编译的 ResourceDictionary。引自MSDN x:Shared Attribute

  

包含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应用程序。

答案 1 :(得分:2)

答案 2 :(得分:1)

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

    <DrawingImage x:Key="diSingle">
        <DrawingImage.Drawing>
            <DrawingGroup>
                <GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 14.72,15.68L 12.38,15.68L 7.205,5.92L 7.11,5.92L 2.29,15.68L 0,15.68L 6.58,2.56L 7.595,2.56L 14.72,15.68 Z "/>
                <GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 21.585,25.6C 21.1017,25.6 20.69,25.4275 20.35,25.0825C 20.01,24.7375 19.84,24.3267 19.84,23.85C 19.84,23.37 20.01,22.955 20.35,22.605C 20.69,22.255 21.1017,22.08 21.585,22.08C 22.0783,22.08 22.4975,22.255 22.8425,22.605C 23.1875,22.955 23.36,23.37 23.36,23.85C 23.36,24.3267 23.1875,24.7375 22.8425,25.0825C 22.4975,25.4275 22.0783,25.6 21.585,25.6 Z "/>
                <GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 28.625,25.6C 28.1417,25.6 27.73,25.4275 27.39,25.0825C 27.05,24.7375 26.88,24.3267 26.88,23.85C 26.88,23.37 27.05,22.955 27.39,22.605C 27.73,22.255 28.1417,22.08 28.625,22.08C 29.1183,22.08 29.5375,22.255 29.8825,22.605C 30.2275,22.955 30.4,23.37 30.4,23.85C 30.4,24.3267 30.2275,24.7375 29.8825,25.0825C 29.5375,25.4275 29.1183,25.6 28.625,25.6 Z "/>
                <GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 35.665,25.6C 35.1817,25.6 34.77,25.4275 34.43,25.0825C 34.09,24.7375 33.92,24.3267 33.92,23.85C 33.92,23.37 34.09,22.955 34.43,22.605C 34.77,22.255 35.1817,22.08 35.665,22.08C 36.1583,22.08 36.5775,22.255 36.9225,22.605C 37.2675,22.955 37.44,23.37 37.44,23.85C 37.44,24.3267 37.2675,24.7375 36.9225,25.0825C 36.5775,25.4275 36.1583,25.6 35.665,25.6 Z "/>
                <GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 48.96,25.155L 48.96,28.48L 47.36,28.48L 47.36,25.28C 45.1267,25.28 43.3133,24.8217 41.92,23.905L 41.92,21.12C 42.5267,21.6633 43.3567,22.1192 44.41,22.4875C 45.4633,22.8558 46.4467,23.04 47.36,23.04L 47.36,15.14C 45.08,14.04 43.6033,13.0258 42.93,12.0975C 42.2567,11.1692 41.92,10.0717 41.92,8.805C 41.92,7.30167 42.4325,6.0025 43.4575,4.9075C 44.4825,3.8125 45.7833,3.15667 47.36,2.94L 47.36,9.53674e-007L 48.96,9.53674e-007L 48.96,2.88C 51.12,2.94333 52.6133,3.23333 53.44,3.75L 53.44,6.4C 52.3167,5.60667 50.8233,5.18 48.96,5.12L 48.96,13.24C 51.1733,14.27 52.6867,15.2658 53.5,16.2275C 54.3133,17.1892 54.72,18.2833 54.72,19.51C 54.72,20.9867 54.2117,22.2267 53.195,23.23C 52.1783,24.2333 50.7667,24.875 48.96,25.155 Z M 47.36,12.37L 47.36,5.215C 46.4733,5.38833 45.7717,5.76917 45.255,6.3575C 44.7383,6.94583 44.48,7.66 44.48,8.5C 44.48,9.38 44.6908,10.1017 45.1125,10.665C 45.5342,11.2283 46.2833,11.7967 47.36,12.37 Z M 48.96,15.945L 48.96,22.915C 51.0933,22.4817 52.16,21.4133 52.16,19.71C 52.16,18.29 51.0933,17.035 48.96,15.945 Z "/>
            </DrawingGroup>
        </DrawingImage.Drawing>
    </DrawingImage>

然后在容器(例如此功能区按钮)中将图像作为dynamic resource(在运行时绑定)访问:

<RibbonToggleButton x:Name="btnSingleline"
                    IsChecked="{Binding RegexOption_Single, Mode=TwoWay}"
                    Label="Single Line"
                    LargeImageSource="{DynamicResource diSingle}"
                    SmallImageSource="{DynamicResource dilines}"
                    ToolTipImageSource="{DynamicResource dilines}"/>

答案 3 :(得分:0)

供参考:

  

在WPF中,x:Shared仅在以下情况下有效:

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

  •   
  • 包含项的ResourceDictionary不得嵌套在另一个ResourceDictionary中。例如,您不能使用   x:Shared适用于ResourceDictionary中样式为   已经是ResourceDictionary项目。

  •   

SQL injection