Silverlight 4 - 在另一个ResourceDictionary中使用StaticResource

时间:2011-04-22 12:13:35

标签: silverlight resourcedictionary staticresource

如果我有这些词典:

dict1.xaml: <Color x:Key="Color1">Red</Color>

dict2.xaml: <SolidColorBrush x:Key="Brush1" Color={StaticResource Color1} />

这有效:

的App.xaml:

<MergedDictionaries>
  <ResourceDictionary Source="dict1.xaml"/>
<MergedDictionaries>

SomePage.xaml:

<UserControl.Resources>
  <MergedDictionaries>
    <ResourceDictionary Source="dict2.xaml"/>
  </MergedDictionaries>
</UserControl.Resources>

这不是:

App.xaml在应用程序级别合并。

我收到有关未找到Color1的错误。

这是为什么? /它有办法解决吗?我知道这个例子很简单,但真正的例子太长了。基本上我只是想在不同的文件中组织我的样式和模板:

  • 一个颜色
  • 一个用于隐式样式
  • 许多用于显式样式

编辑:奇怪的是,如果我在Application_Startup上的代码中执行此操作,在设置RootVisual属性之前,我没有收到错误...我只是为什么感到困惑!< / p>

4 个答案:

答案 0 :(得分:5)

不幸的是,你在Silverlight资源系统中遇到了一个恼人的限制,我只能想象这是一些优化问题。这里似乎有一些异步行为,MergedDictionaries中的每个字典都是并行加载的,因此当加载“dict2.xaml”时,你不能依赖“dict1.xaml”的内容。

最简单的解决方案是在Dict2中包含Dict1的合并: -

的App.xaml:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="dict2.xaml" />
<ResourceDictionary.MergedDictionaries>

Dict2.xaml:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="dict1.xaml" />
    </ResourceDictionary.MergedDictionaries>
    .... <!-- dict2 resource -->
</ResourceDictionary>

答案 1 :(得分:1)

这将在App.xaml

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="dict1.xaml" />
                <ResourceDictionary Source="dict2.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

只要你在另一个字典之前定义字典,我就会感到有点意外,类似于上面的内容是行不通的。

答案 2 :(得分:1)

你可以用@Anthony提出的方式来做,但这里有一个警告 - 如果你使用你的第一个资源字典,例如,其他5个字典,那么它将被加载5次,你将有6个副本相同的资源字典(如果你在App.xaml中引用它的情况),这对性能不是很好。这可以使用Silverlight的资源字典的小子类来修复 - http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/

答案 3 :(得分:0)

我对这个问题很感兴趣。 “合并资源字典集合中的资源查找逻辑是最后一次输出。”换句话说,如果您有多个字典,其中一个引用另一个,那么包含引用资源的字典必须位于堆栈的顶部。确保以正确的顺序引用它们并小心确保堆栈顶部的字典不依赖于堆栈底部的字典

<Application.Resources>         
 <ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>                                     
   <ResourceDictionary Source="Dict1.xaml" /> 
   <ResourceDictionary Source="dependsOnDict1.xaml" />                   
  </ResourceDictionary.MergedDictionaries>         
 </ResourceDictionary>     
</Application.Resources>