Silverlight 3中合并资源字典的正确使用方法

7
根据我所阅读的:http://msdn.microsoft.com/en-us/library/cc903952(VS.95).aspx,具体来说是标记为“Forward References With a ResourceDictionary”的部分:
引用任何给定资源字典中的静态资源必须引用在该资源引用之前已经被词法上定义的资源。静态资源引用无法解析前向引用。因此,如果您使用静态资源引用,您必须设计您的资源字典结构,使预期进行进一步资源使用的资源被定义在或接近各自资源字典的开头。
这是否意味着我不能在我的App.xaml中做这样的事情:
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Assets/Colors.xaml"/>
            <ResourceDictionary Source="Assets/Brushes.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

在 Brushes.xaml 中包含 SolidColorBrush、LinearColorBrush 等定义,这些定义引用了 Colors.xaml 中定义的颜色吗?

例如:

<SolidColorBrush x:Key="OrangeRedBrush" Color="{StaticResource AppOrangeRed}"/>

我会在 Colors.xaml 文件中定义我的颜色,类似这样:

<Color x:Key="AppOrangeRed">#FFBF3C1F</Color>

我遇到了一个运行时错误,它指出无法找到实例中关键字为 'AppOrangeRed' 的资源。在组织颜色和画刷以便能够重用它们方面,有哪些最佳实践(适当情况下,我理解颜色是结构体,而画刷是引用对象,详见http://weblogs.manas.com.ar/spalladino/2009/03/02/silverlight-xaml-guidelines/)。
谢谢, Rob
2个回答

7

我现在对此有了更清晰的了解。如果您有多个应用程序范围的资源,有时相互引用,您需要(1)在App.xaml中声明的主字典中对它们进行排序,并且您需要在每个文件中包含一个 section 来引入依赖部分。因此,如果我有三个文件,例如 Brushes.xaml、ScrollViewerStyles.xaml 和 ComboBoxStyles.xaml,并且 ComboBoxStyles.xaml 依赖前两个文件,则只需在该文件顶部添加:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml"/>
    <ResourceDictionary Source="ScrollViewerStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>

谢谢rcecil,我也遇到了这个问题,甚至我的第一个文件也是颜色和画笔:) 很好的简单答案。Justin - Justin

3

Rob,

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

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Assets/Brushes.xaml"/>
            <ResourceDictionary Source="Assets/Colors.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

根据“合并资源字典”部分的文档

在查找顺序方面,仅在检查声明了MergedDictionaries的ResourceDictionary的所有键控资源后才会检查MergedDictionaries字典。然后,检查MergedDictionaries中声明顺序的相反顺序中的每个字典。换句话说,在合并的资源字典集合中的检索逻辑是后进先出。

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

我想如果您有一组“蓝色”样式并希望使用一组“橙色”样式覆盖它们以供另一个客户端使用,则可以通过在MergedDictionaries集合中包含橙色键来实现,以便它们首先被找到。

总之,我分享您的沮丧,并希望在不久的将来能够实现此类功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接