WPF使用来自多个项目的多个资源字典

时间:2017-08-15 06:48:16

标签: wpf resourcedictionary

我有两个类库项目: 项目A.Themes 项目B.Themes

项目A.Themes是我的基础主题项目。 项目B.Themes使用A.Themes并且有新的样式和一些资源具有已在A.Themes中定义的键。

我们希望在我们的项目中使用这两个主题,如果我们使用在两个项目中定义的资源,我们想从B.Themes中获取资源。

这是我们的代码:

A.Themes几个样式文件:

Brushes.xaml
Buttons.xaml
CheckBox.xaml

等。

我们在Bundle.Xaml中加载它们:

<ResourceDictionary.MergedDictionaries>         
   <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Assets/Brushes.xaml"/>
   <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Assets/Buttons.xaml"/>
   <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Assets/CheckBox.xaml" />
</ResourceDictionary.MergedDictionaries>

B.Themes具有相同的文件:

Brushes.xaml
Buttons.xaml
CheckBox.xaml

我们将它们加载到Bundle.Xaml中并添加A.Themes包

<ResourceDictionary.MergedDictionaries>         
   <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Bundle.xaml"/>
   <ResourceDictionary Source="pack://application:,,,/B.Themes;component/Assets/Brushes.xaml"/>
   <ResourceDictionary Source="pack://application:,,,/B.Themes;component/Assets/Buttons.xaml"/>
   <ResourceDictionary Source="pack://application:,,,/B.Themes;component/Assets/CheckBox.xaml" />
</ResourceDictionary.MergedDictionaries>

在我们的项目中,我们将它们加载到App.xaml:

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Bundle.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/B.Themes;component/Bundle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

问题是: 1.它并不总是从B.Themes获取资源,我们无法找出原因。 2.如果我从app.xaml删除对A.Themes / Bundle.xaml的引用,项目无法从A.Themes中找到资源,即使它包含在B.Themes / Bundle.xaml

请注意: 我们参考B.Themes中的A.Themes项目 并参考主要项目中的A.Themes和B.Themes

有人可以帮助我理解这里发生的事情吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

装货单并不是您所期望的。来自MSDN:

  

合并字典中的资源占用资源查找范围中的位置,该位置就在它们合并到主资源字典的范围之后

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/merged-resource-dictionaries

因此,合并到程序集A的Bundle.xaml的字典实际上是在其他字典之后加载的。

有关更多信息和相同行为的示例,请参阅以下链接:https://social.msdn.microsoft.com/Forums/vstudio/en-US/3bea80f9-d1db-4cb7-ae7a-77a02eaf4ec9/resourcedictionary-load-order?forum=wpf