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

时间:2010-02-09 02:51:18

标签: 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>

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

e.g。

<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/中解释)

由于 罗布

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

罗布,

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

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

来自“Merged Resource Dictionaries”下的documentation

  

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

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

我想如果你有一个“蓝色”样式的集合并希望用不同客户端的一组“橙色”样式覆盖它们,这将是有用的。您可以通过在MergedDictionaries集合中的蓝色键下面包含橙色键来完成此操作,因此首先在资源查找序列中找到它们。

无论如何,我在不久的将来会分享你对这样一个功能的沮丧和希望。