7

正如我所读到的: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 中定义的颜色?

例如

<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/ )

谢谢罗伯

4

2 回答 2

7

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

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml"/>
    <ResourceDictionary Source="ScrollViewerStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
于 2010-04-26T23:03:35.467 回答
3

抢,

我以与您相同的方式理解文档。我注意到也可以像这样交换 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 中的每个字典,其顺序与在 MergedDictionaries 属性中声明它们的顺序相反。换句话说,来自合并资源字典集合内的检索逻辑是后进先出的。

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

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

无论如何,我分享你的挫败感,并希望在不久的将来某个时候有这样的功能。

于 2010-02-24T15:50:10.057 回答