.NET 6 WPF引用NuGet包嵌入字体StaticResource失效问题排查
问题根源与修复方案
核心原因
.NET 6(及.NET Core系列)的WPF资源解析逻辑和.NET Framework 4.8存在关键差异:
- .NET Framework加载跨程序集资源字典时,会自动将资源中定义的
FontFamily的pack URI关联到资源字典所在的类库程序集,因此能正确定位到类库中的字体文件。 - .NET 6中,从NuGet包类库加载的资源字典里,
FontFamily的pack URI默认会使用应用程序的程序集上下文,导致实际解析路径变成pack://application:,,,/你的应用程序集;component/Fonts/#Inter Black,自然找不到类库中的字体文件。
而直接写完整pack URI或在应用本地定义资源时,你明确指定了类库的程序集名称,所以.NET 6能正确解析路径。
修复方案
方案1:使用相对路径定义FontFamily
修改类库中Themes/Fonts.xaml里的FontFamily定义,用相对路径替代绝对pack URI,让资源字典自动基于自身所在程序集解析路径:
<!-- 替换原绝对URI定义 --> <FontFamily x:Key="inter-black">./../Fonts/#Inter Black</FontFamily>
(注:因为Fonts文件夹和Themes文件夹同级,所以用../回到上级目录再指向Fonts)
这种方式兼容.NET Framework 4.8和.NET 6,无需修改应用端代码。
方案2:使用ComponentResourceKey绑定类库上下文
通过明确绑定资源到类库程序集,避免.NET 6的上下文解析错误:
- 在类库中创建静态资源键类:
namespace DesignSystem { public static class FontResourceKeys { public static ComponentResourceKey InterBlackKey => new ComponentResourceKey(typeof(FontResourceKeys), "inter-black"); } }
- 修改类库
Fonts.xaml中的资源定义:
<FontFamily x:Key="{x:Static local:FontResourceKeys.InterBlackKey}"> pack://application:,,,/DesignSystem;component/Fonts/#Inter Black </FontFamily>
- 在应用中引用资源时,使用ComponentResourceKey:
<TextBlock FontFamily="{StaticResource {x:Static DesignSystem:FontResourceKeys.InterBlackKey}}" Text="Sample Text" />
方案3:确认字体文件的嵌入设置
确保类库中的.ttf字体文件属性配置正确:
- 生成操作:
嵌入的资源 - 复制到输出目录:
不复制
.NET 6对资源嵌入的校验更严格,若此设置错误,也可能导致字体无法加载。
补充说明
两种框架的差异本质是.NET Core重构了WPF的资源加载系统,优化了性能但改变了跨程序集资源的上下文默认行为,通过上述方案能统一兼容两个平台的资源解析逻辑。
内容的提问来源于stack exchange,提问作者partyzone
相关产品推荐
相关产品推荐

