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

WPF Using multiple Resource Dictionaries from multiple projects

我有两个 class 库项目: 项目 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 的引用,即使它包含在 B.[=41 中,项目也无法从 A.Themes 中找到资源=].xaml

注意: 我们在 B.Themes 中引用了 A.Themes 项目 并在主项目

中引用A.Themes和B.Themes

有人可以帮我理解这是怎么回事吗? 谢谢!

加载顺序与您的预期不符。来自 MSDN:

Resources in a merged dictionary occupy a location in the resource lookup scope that is just after the scope of the main resource dictionary they are merged into

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

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

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