在Silverlight 3中正确使用合并资源字典

Rob*_*emo 7 silverlight resources resourcedictionary mergeddictionaries

正如我读到的:http://msdn.microsoft.com/en-us/library/cc903952(VS.95).aspx,特别是标有"使用ResourceDictionary的前向引用"的部分:

来自任何给定资源字典的静态资源引用必须引用已在资源引用之前以词法方式定义的资源.静态资源引用无法解析转发引用.因此,如果使用静态资源引用,则必须设计资源字典结构,以便在每个相应资源字典的开头或附近定义用于进一步按资源使用的资源.

这是否意味着我无法在App.xaml中执行此类操作:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Assets/Colors.xaml"/>
            <ResourceDictionary Source="Assets/Brushes.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

其中Brushes.xaml包含SolidColorBrush,LinearColorBrush等,引用Colors.xaml中定义的颜色的定义?

例如

<SolidColorBrush x:Key="OrangeRedBrush" Color="{StaticResource AppOrangeRed}"/>
Run Code Online (Sandbox Code Playgroud)

我在Colors.xaml中定义我的颜色,如:

<Color x:Key="AppOrangeRed">#FFBF3C1F</Color>
Run Code Online (Sandbox Code Playgroud)

我收到一个运行时错误,指出它无法找到具有键'AppOrangeRed'的资源.

组织颜色和画笔的最佳实践是什么,以便可以重复使用(在适当的情况下,我理解颜色是结构和画笔是参考对象,在http://weblogs.manas.com.ar/spalladino/2009/中解释03/02/silverlight-xaml-guidelines /)

谢谢Rob

Rob*_*emo 7

我现在明白它了解一点.如果您有多个应用程序范围资源有时相互引用,则需要(1)在App.xaml中声明的主字典中对它们进行排序,并且您需要在每个文件中包含一个引入依赖项的部分.因此,如果我有三个文件,例如Br​​ushes.xaml,ScrollViewerStyles.xaml和ComboBoxStyles.xaml,以及ComboBoxStyles.xaml依赖于前两个,我需要简单地添加到该文件的顶部:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml"/>
    <ResourceDictionary Source="ScrollViewerStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)


小智 3

抢,

我对文档的理解和你一样。我注意到也可以像这样交换 MergedDictionaries,并且仍然收到相同的运行时异常:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Assets/Brushes.xaml"/>
            <ResourceDictionary Source="Assets/Colors.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

从“合并资源字典”下的文档:

就查找顺序而言,只有在检查了声明 MergedDictionaries 的 ResourceDictionary 的所有键控资源后,才会检查 MergedDictionaries 字典。然后,按照与 MergedDictionaries 属性中声明的顺序相反的顺序检查 MergedDictionaries 中的每个字典。换句话说,合并资源字典集合内的检索逻辑是后进先出。

似乎您可以通过按此顺序包含 ResourceDictionaries 中定义的某些键来覆盖它们,但您无法引用查找序列中在另一个字典之前定义的一个字典中的样式。这是令人沮丧且不直观的。

我想如果您有一组“蓝色”样式并希望为不同的客户端使用一组“橙色”样式覆盖它们,这会很有用。您可以通过在 MergedDictionaries 集合中包含位于蓝色键下方的橙色键来实现此目的,以便在资源查找序列中首先找到它们。

不管怎样,我和你一样感到沮丧,并希望在不久的将来出现这样的功能。