【问题标题】:Proper usage of Merged Resource Dictionaries in Silverlight 3在 Silverlight 3 中正确使用合并的资源字典
【发布时间】:2010-02-09 02:51:17
【问题描述】:

我读到: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/ 中进行了解释)

谢谢 抢

【问题讨论】:

    标签: silverlight resources resourcedictionary mergeddictionaries


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 rcecil,我遇到了这个确切的问题。甚至到我的第一个文件是颜色和画笔这一事实:)很好的简单答案。贾斯汀
    【解决方案2】:

    罗伯,

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

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

    来自“合并资源字典”下的documentation

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

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

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

    无论如何,我和你一样感到沮丧,并希望在不久的将来某个时候出现这样的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2011-04-28
      相关资源
      最近更新 更多