.NET 5 WPF类库无法通过App.xaml定义全局资源问题咨询
问题根因
.NET Core 3.0及以上版本(包含.NET 5/6/7/8)的WPF类库项目,禁止配置ApplicationDefinition类型的文件,类库本身没有应用生命周期入口,所以原来.NET Framework中用App.xaml做全局资源的方案不再适用。
可用解决方案
方案1:创建类库全局合并资源字典(最低改造成本)
不用删除原有零散资源字典,只需在类库中新增一个总合并资源字典,比如命名为GlobalResources.xaml,内容如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="ResourceDictionary1.xaml" /> <ResourceDictionary Source="ResourceDictionary2.xaml" /> <ResourceDictionary Source="ResourceDictionary3.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary>
后续类库内部的XAML文件如果需要使用资源,只需引用这一个总字典即可,无需逐个引入多个零散字典,大幅简化引用逻辑。
方案2:使用WPF类库默认主题字典(自动全局生效)
WPF有约定俗成的类库全局主题资源规则,按规则配置后资源对类库所有XAML自动生效,完全不需要单个文件单独引用:
- 在类库根目录创建
Themes文件夹 - 在
Themes文件夹下新建名为Generic.xaml的资源字典,把所有需要全局生效的资源、合并字典都写入该文件,代码示例:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/你的类库程序集名;component/ResourceDictionary1.xaml" /> <ResourceDictionary Source="/你的类库程序集名;component/ResourceDictionary2.xaml" /> <ResourceDictionary Source="/你的类库程序集名;component/ResourceDictionary3.xaml" /> </ResourceDictionary.MergedDictionaries> <!-- 也可以直接在此处编写全局样式、静态资源 --> </ResourceDictionary>
- 打开类库的项目文件(.csproj),确认或添加如下配置,确保
Generic.xaml被识别为主题资源:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0-windows</TargetFramework> <UseWPF>true</UseWPF> <!-- 下方配置为关键,指定类库的主题字典加载规则 --> <ThemeInfoAttribute="Microsoft.Windows.Themes.ResourceDictionaryLocation.None,Microsoft.Windows.Themes.ResourceDictionaryLocation.SourceAssembly"/> </PropertyGroup> </Project>
配置完成后,Generic.xaml内的所有资源会自动对类库内部的所有自定义控件、XAML视图全局生效。
方案3:由引用类库的主应用合并资源
如果你的类库是给上层WPF应用项目提供组件使用,也可以要求上层主项目在自己的App.xaml中合并类库的全局资源字典,这样资源会在整个应用范围内(包含类库内部的所有组件)生效,类库侧不需要额外配置,只需给主项目提供资源引用路径即可:
<!-- 上层主应用的App.xaml配置示例 --> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/你的类库程序集名;component/GlobalResources.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
内容的提问来源于stack exchange,提问作者krimog
相关产品推荐
相关产品推荐

