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
我有两个 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