7

如果我有这些字典:

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

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

这有效:

应用程序.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属性之前,我没有收到错误...我只是对为什么感到困惑!

4

4 回答 4

5

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

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

应用程序.xaml:

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

字典2.xaml:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="dict1.xaml" />
    </ResourceDictionary.MergedDictionaries>
    .... <!-- dict2 resource -->
</ResourceDictionary>
于 2011-04-24T20:53:29.670 回答
1

这将在 App.xaml 中

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

只要您在另一个字典之前定义字典,我就会有点惊讶,类似于上面的东西是行不通的。

于 2011-04-22T17:22:32.407 回答
1

您可以按照@Anthony 建议的方式执行此操作,但这里有一个警告 - 如果您在例如 5 个其他词典中使用您的第一个资源词典,那么它将被加载 5 次,并且您将拥有 6 个相同的副本资源字典(以防您在 App.xaml 中引用它时)这对性能来说不是很好。这可以使用silverlight的资源字典的小子类从这里解决 - http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/

于 2011-11-09T16:26:51.073 回答
0

我和谭一起做这个。“合并资源字典集合中的资源查找逻辑是后进先出。” 换句话说,如果您有多个字典,其中一个引用另一个,那么包含被引用资源的字典必须位于堆栈的顶部。确保以正确的顺序引用它们,并注意确保堆栈顶部的字典不依赖于堆栈底部的字典

<Application.Resources>         
 <ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>                                     
   <ResourceDictionary Source="Dict1.xaml" /> 
   <ResourceDictionary Source="dependsOnDict1.xaml" />                   
  </ResourceDictionary.MergedDictionaries>         
 </ResourceDictionary>     
</Application.Resources> 
于 2012-02-27T15:02:32.210 回答