| File: Hosting\Fonts\FontsMauiAppBuilderExtensions.cs | Web Access |
| Project: src\src\Core\src\Core.csproj (Microsoft.Maui) |
using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Maui.Hosting; using Microsoft.Maui.Hosting.Internal; namespace Microsoft.Maui.Hosting { public static class FontsMauiAppBuilderExtensions { /// <summary> /// Configures the <see cref="MauiAppBuilder"/> with fonts. /// </summary> /// <param name="builder">The <see cref="MauiAppBuilder"/> to configure.</param> /// <returns>The configured <see cref="MauiAppBuilder"/>.</returns> public static MauiAppBuilder ConfigureFonts(this MauiAppBuilder builder) { builder.ConfigureFonts(configureDelegate: null); return builder; } /// <summary> /// Configures the <see cref="MauiAppBuilder"/> with a specified delegate <paramref name="configureDelegate"/> to register fonts in the application. /// </summary> /// <param name="builder">The <see cref="MauiAppBuilder"/> to configure.</param> /// <param name="configureDelegate">A configuration delegate that can register fonts in the provided <see cref="IFontCollection"/>.</param> /// <returns>The configured <see cref="MauiAppBuilder"/>.</returns> public static MauiAppBuilder ConfigureFonts(this MauiAppBuilder builder, Action<IFontCollection>? configureDelegate) { builder.Services.TryAddSingleton<IEmbeddedFontLoader>(svc => new EmbeddedFontLoader(svc)); builder.Services.TryAddSingleton<IFontRegistrar>(svc => new FontRegistrar(svc.GetRequiredService<IEmbeddedFontLoader>(), svc)); builder.Services.TryAddSingleton<IFontManager>(svc => new FontManager(svc.GetRequiredService<IFontRegistrar>(), svc)); if (configureDelegate != null) { builder.Services.AddSingleton<FontsRegistration>(new FontsRegistration(configureDelegate)); } builder.Services.TryAddEnumerable(ServiceDescriptor.Transient<IMauiInitializeService, FontInitializer>()); return builder; } internal class FontsRegistration { private readonly Action<IFontCollection> _registerFonts; public FontsRegistration(Action<IFontCollection> registerFonts) { _registerFonts = registerFonts; } internal void AddFonts(IFontCollection fonts) { _registerFonts(fonts); } } internal class FontInitializer : IMauiInitializeService { private readonly IEnumerable<FontsRegistration> _fontsRegistrations; readonly IFontRegistrar _fontRegistrar; public FontInitializer(IEnumerable<FontsRegistration> fontsRegistrations, IFontRegistrar fontRegistrar) { _fontsRegistrations = fontsRegistrations; _fontRegistrar = fontRegistrar; } public void Initialize(IServiceProvider __) { if (_fontsRegistrations != null) { var fontsBuilder = new FontCollection(); // Run all the user-defined registrations foreach (var font in _fontsRegistrations) { font.AddFonts(fontsBuilder); } // Register the fonts in the registrar foreach (var font in fontsBuilder) { if (font.Assembly == null) _fontRegistrar.Register(font.Filename, font.Alias); else _fontRegistrar.Register(font.Filename, font.Alias, font.Assembly); } } } } } }