Точкой входа в приложение .NET Maui является класс, который по умолчанию называется MauiProgram и который располагается в стандартном проекте в файле MauiProgram.cs.
По умолчанию он имеет следующий код:
using Microsoft.Extensions.Logging; namespace HelloApp { public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); #if DEBUG builder.Logging.AddDebug(); #endif return builder.Build(); } } }
Данный класс определяет только один метод - CreateMauiApp(), который призван создать объект приложения MAUI - объект MauiApp. Затем каждая платформа вызывает данный метод и таким образом создает приложение, после чего мы сможем с ним взаимодействовать на экране смартфона или десктопа.
Для создания объекта MauiApp применяется билдер - класс MauiAppBuilder, который возвращается статическим методом MauiApp.CreateBuilder() и который позволяет настроить отдельные аспекты приложения MAUI.
var builder = MauiApp.CreateBuilder(); // MauiAppBuilder
В частности, MauiAppBuilder определяет следующие методы:
UseMauiApp: устанавливает класс, который и определяет визуальный интерфейс и логику приложения. Данный класс должен представлять тип Microsoft.Maui.IApplication (в данном случае класс App наследуется от класса Application, который реализует интерфейс IApplication)
ConfigureContainer: устанавливает фабрику провайдера сервисов
ConfigureAnimations: устанавливает применяемые анимации
ConfigureEffects: устанавливает глобальные эффекты приложения
ConfigureFonts: настраивает глобальные шрифты приложения
ConfigureEssentials: устанавливает ряд настроек приложения, в частности, версионирование и ключ для картографических сервисов
ConfigureImageSources: переопределяет источник изображений
ConfigureMauiHandlers: устанавливает кастомные обработчик для событий визуальных элементов
LoadFromXaml: загружает определение интерфейса из файла xaml
Кроме того, класс MauiAppBuilder имеет ряд свойств:
Configuration: позволяет управлять конфигурацией приложения
Services: устанавливает сервисы приложения
Logging: устанавливает настройки логгирования
В коде приложения по умолчанию применяются только два из вышеперечисленных методов:
builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); })
В данном случае в качестве класса, который устанавливает интерфейс и логику приложения, применяется класс App. Кроме того, также добавляются два шрифта, которые можно найти в проекте в папке Resources/Fonts
После того, как все настройки приложения установлены, добавляется возможность логгирования, когда приложение находится в процессе отладки:
#if DEBUG builder.Logging.AddDebug(); #endif
И в конце выполняется создание объекта приложения MauiApp методом Build:
return builder.Build();
Таким образом, для создания минимального приложения Maui достаточно вызывать метод UseMauiApp()
, который типизируется типом, который реализует интерфейс IApplication:
namespace HelloApp; public static class MauiProgram { public static MauiApp CreateMauiApp() { MauiAppBuilder builder = MauiApp.CreateBuilder(); builder.UseMauiApp<App>(); return builder.Build(); } }
MauiAppBuilder при создании объекта MauiApp с помощью метода UseMauiApp() устанавливает класс, который определяет визуальный интерфейс приложения. Данный класс должен представлять реализацию интерфейса Microsoft.Maui.IApplication
using System.Collections.Generic; namespace Microsoft.Maui { public interface IApplication : IElement { IReadOnlyList<IWindow> Windows { get; } IWindow CreateWindow(IActivationState? activationState); void OpenWindow(IWindow window); void CloseWindow(IWindow window); void ThemeChanged(); AppTheme UserAppTheme { get; } } }
Этот интерфейс определяет два свойства и четыре метода, главным образом, для управления окнами приложения.
В проекте Maui по умолчанию уже определяется подобный класс, который реализует данный интерфейс, - класс App. Если быть точнее, класс App наследуется от класса Application, который реализует интерфейс IApplication.
Определение класса App разбито на два файла: App.xaml и App.xaml.cs. Файл App.xaml призван в xml-подобной форме определить используемые ресурсы. Например, откроем его код:
<?xml version = "1.0" encoding = "UTF-8" ?> <Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:HelloApp" x:Class="HelloApp.App"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Resources/Styles/Colors.xaml" /> <ResourceDictionary Source="Resources/Styles/Styles.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
Далее мы более подробно разберем использование ресурсов. Но если вкратце в данном случае для определения приложения определяется элемент <Application>
.
Внутри этого элемента с помощью элемента <ResourceDictionary>
задается добавление определенного ресурса. Так, в данном случае добавляются два ресурса - файлы Colors.xaml и
Styles.xaml, которые располагаются в проекте в папке Resources/Styles и которые задают стилевые настройки.
Непосредственно сам класс App определен в файле App.xaml.cs:
namespace HelloApp; public partial class App : Application { public App() { InitializeComponent(); MainPage = new AppShell(); } }
здесь мы видим, что класс App наследуется от класса Application и содержит только конструктор. В конструкторе сначала вызывается метод InitializeComponent(), благодаря которому класс App получает определение ресурсов приложения из файла App.xaml.
И далее устанавливается свойство MainPage. Через это свойство класс App устанавливает главную страницу приложения, которая и определяет, что мы увидим на экране устройства.