【问题标题】:Silverlight 4 - use StaticResource from one ResourceDictionary in anotherSilverlight 4 - 在另一个 ResourceDictionary 中使用 StaticResource
【发布时间】:2011-04-22 12:13:34
【问题描述】:

如果我有这些词典:

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

【问题讨论】:

    标签: silverlight resourcedictionary staticresource


    【解决方案1】:

    不幸的是,您在 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>
    

    【讨论】:

      【解决方案2】:

      这将在 App.xaml 中

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

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

      【讨论】:

      • 在发布之前我已经尝试过了,因为那将是明显的罪魁祸首。然而,没有这样的运气。它似乎试图同时解决,这对我来说简直太可笑了,因为我看不到一个你想要这种行为的案例,特别是如果 MS 没有给我们DynamicResource
      • 在 app.xaml 失败时查看您的 app.xaml 可能会有所帮助。我自己做了这件事,看不到或想不出我必须做些什么才能让它发挥作用
      • 这就是我的 App xaml 除了文件声明之外的所有内容(我没有触及的东西)。当您说您已完成此操作时,您是否有字典,其中一个引用在另一个中定义的资源?因为从字面上看,我已经在一个全新的项目中复制了这个,除了两个字典、合并字典和一个带有一个文本块的页面,使用其中一个字典中的样式(尽管我认为它没有那么远)
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 这不是表现出来的行为。如果是这样的话,就没有问题了,我也不会在将近一年前发布这个问题。试试看:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        相关资源
        最近更新 更多