如何在.NET MAUI中通过DLL/NuGet从核心项目访问MaterialIconsFont.ttf
解决.NET MAUI核心项目字体在子项目无需重复添加即可使用的问题
要让核心项目中的字体资源直接被子项目复用,无需在子项目中重复添加TTF文件,你需要确保核心项目正确嵌入字体资源,并通过扩展方法将字体注册逻辑封装,供子项目调用。具体步骤如下:
一、核心项目配置调整
确认字体文件的项目配置
打开核心项目的.csproj文件,确保字体文件的MauiFont条目正确配置,保证字体被作为嵌入式资源打包到DLL中:<ItemGroup> <MauiFont Include="Resources\Fonts\MaterialFontIcons.ttf" Alias="MaterialDesignIconsFont" /> </ItemGroup>注:
Alias值要和FontIconHelper中定义的MaterialDesignIconsFont常量完全一致,避免大小写或拼写错误。封装字体注册扩展方法
在核心项目中创建一个静态扩展类,将字体注册逻辑封装起来,方便子项目调用:using Microsoft.Maui.Hosting; namespace Mobile.UI.Core; public static class CoreMauiExtensions { public static MauiAppBuilder UseCoreSharedFonts(this MauiAppBuilder builder) { builder.ConfigureFonts(fonts => { // 路径相对于核心项目的资源结构,MAUI会自动从嵌入式资源中加载该字体 fonts.AddFont("Resources/Fonts/MaterialFontIcons.ttf", FontIconHelper.MaterialDesignIconsFont); }); return builder; } }重新生成核心项目
编译核心项目,确保字体资源已正确嵌入到输出的DLL中。
二、子项目配置调整
保留核心项目DLL引用
维持子项目对核心项目DLL的现有引用。调用核心项目的字体注册方法
在子项目的MauiProgram.cs中,调用核心项目提供的扩展方法,替代手动添加字体的逻辑:var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .UseCoreSharedFonts() // 注册核心项目中的字体 .ConfigureServices();验证字体使用
保留子项目中原有XAML的字体引用代码,无需修改:xmlns:helper="clr-namespace:Mobile.UI.Core.Helpers;assembly=Mobile.UI.Core" <Image x:Name="image" HeightRequest="20" HorizontalOptions="EndAndExpand"> <Image.Source> <FontImageSource Glyph="{x:Static helper:FontIconHelper.AccessPoint}" Size="20" Color="Black" FontFamily="{x:Static helper:FontIconHelper.MaterialDesignIconsFont}"/> </Image.Source> </Image>
问题根源说明
之前的问题在于:.NET MAUI的字体注册是项目级别的独立配置,子项目的MAUI运行时不会自动扫描并加载核心项目中的字体资源。只有通过在子项目中调用核心项目封装的字体注册逻辑,才能让MAUI从核心项目的嵌入式资源中加载字体,避免重复添加TTF文件。
内容的提问来源于stack exchange,提问作者Divyesh
相关产品推荐
相关产品推荐

