正如我读到的那样: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/中解释)
由于 罗布
答案 0 :(得分:7)
我现在明白了一点。如果您有多个应用程序范围资源有时相互引用,则需要(1)在App.xaml, AND 中声明的主字典中对它们进行排序,您需要在每个文件中包含一个部分拉入依赖的碎片。因此,如果我有三个文件,例如Brushes.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集合中的蓝色键下面包含橙色键来完成此操作,因此首先在资源查找序列中找到它们。
无论如何,我在不久的将来会分享你对这样一个功能的沮丧和希望。