.NET MAUI (Multi-platform App UI) to nowoczesna platforma od Microsoft, pozwalająca tworzyć aplikacje wieloplatformowe z jednej bazy kodu. W tym artykule znajdziesz praktyczne wskazówki dotyczące konfiguracji środowiska, pracy z szablonami oraz budowy pierwszej aplikacji MAUI. Platforma łączy możliwości Xamarin.Forms z nowoczesnym .NET i oferuje programistom zintegrowane środowisko dla Androida, iOS, macOS, Windows i Tizen. Dzięki C# i XAML możesz tworzyć wydajne, natywne aplikacje bez potrzeby ich osobnego pisania dla każdej platformy.

Wprowadzenie do .NET MAUI i jego możliwości

.NET MAUI jest rozwinięciem Xamarin.Forms, oferując jednolite narzędzia do programowania aplikacji na wiele systemów operacyjnych. Dzięki architekturze zaprojektowanej pod kątem maksymalnego współdzielenia kodu i dostępu do natywnych funkcji każdy projekt jest łatwiejszy w utrzymaniu i rozwijaniu.

Największym atutem .NET MAUI jest możliwość budowania aplikacji natywnych na wszystkie kluczowe platformy mobilne i desktopowe z jednego kodu: Android, iOS, macOS, Windows oraz Tizen. To przekłada się na szybszy rozwój oraz niższe koszty utrzymania. Platforma automatycznie dostosowuje UI do każdej platformy, gwarantując użytkownikom intuicyjne wrażenia niezależnie od urządzenia.

Architektura MAUI jest modularna i łatwo ją rozszerzać. Wzorzec dependency injection oraz system usług pozwalają płynnie integrować zewnętrzne biblioteki, chmurę i funkcje natywne. Bogaty wybór komponentów UI dostosowuje się do wyglądu platformy, zachowując możliwość ich pełnej personalizacji.

System hot reload w .NET MAUI to prawdziwy przełom: zmiany w XAML i C# widzisz natychmiast, bez przeładowania aplikacji. To dramatycznie przyspiesza prace przy UI i debugowaniu. Dodatkowo Live Visual Tree oraz Property Explorer pozwalają na bieżąco badać i modyfikować strukturę interfejsu.

Konfiguracja środowiska programistycznego

Przed rozpoczęciem pracy z .NET MAUI konieczna jest odpowiednia instalacja narzędzi i konfiguracja środowiska. Podstawą jest Visual Studio 2022 (minimum 17.12) z modułem „Multi-platform App UI development” – to zapewni kompletne SDK, emulatory i narzędzia.

Proces konfiguracji na Windows obejmuje:

  • instalację Android SDK – pozwala tworzyć i testować aplikacje na Androidzie,
  • obsługę Android SDK Manager do zarządzania wersjami SDK i emulatorami,
  • konfigurację połączenia z hostem kompilacji Mac (wymagane przy programowaniu na iOS),
  • ustawienie certyfikatów i profili provisioning do uruchamiania aplikacji na fizycznych urządzeniach Apple.

Dla osób preferujących lżejsze narzędzia, Visual Studio Code także umożliwia pracę z MAUI:

  • zainstaluj rozszerzenia: C# Dev Kit oraz .NET MAUI Extension,
  • ręczna instalacja .NET SDK i workload MAUI przez .NET CLI,
  • wsparcie dla IntelliSense, debugera oraz zarządzania projektami.

Konfiguracja środowiska testowego oraz emulatorów:

  • Android SDK Manager służy do uruchamiania emulatorów Androida z różnymi konfiguracjami,
  • na Mac testujesz iOS przez Xcode i jego symulatory,
  • testy na urządzeniach fizycznych wymagają konta Apple Developer oraz konfiguracji certyfikatów.

Optymalizacja środowiska pracy ma kluczowe znaczenie. Włącz Fast Deployment dla szybszego wdrażania, ustaw Incremental Build, zadbaj o konfigurację ścieżek oraz zmiennych środowiskowych dla SDK. To gwarantuje stabilną pracę narzędzi programistycznych.

Szablony projektów i struktura aplikacji

.NET MAUI oferuje szeroki wybór szablonów projektów. Oto kluczowe z nich wraz z zastosowaniami:

  • .NET MAUI App – kompletny szablon startowy z konfiguracją, przykładowymi stronami i plikami konfiguracyjnymi;
  • .NET MAUI Class Library – do budowy bibliotek wielokrotnego użytku, np. własnych kontrolek UI i logiki biznesowej;
  • Shared Class Library – idealna do dzielenia kodu z innymi typami aplikacji, np. web czy desktop.

Typowy projekt MAUI zbudowany jest z następujących części:

  • MauiProgram.cs – główny punkt wejścia, konfiguracja usług, zależności i funkcji platformowych;
  • App.xaml i App.xaml.cs – globalne style, kolory oraz szablony interfejsu;
  • AppShell – zarządza nawigacją i strukturą wizualną (flyout, tabbed, hierarchia stron);
  • Resources – przechowuje fonty, obrazy, ikony i pliki konfiguracyjne (osobne foldery dla różnych typów zasobów);
  • Resources/Raw – tu pliki są osadzane jako embedded resources, lecz dostępne w runtime przez aplikację.

Taka organizacja ułatwia zarządzanie zasobami, pozwala wydzielać logikę na odpowiednie warstwy, a cała struktura jest zoptymalizowana dla każdej wspieranej platformy.

Tworzenie pierwszej aplikacji MAUI

Krok po kroku przedstawiam proces stworzenia pierwszego projektu MAUI w Visual Studio 2022:

  1. Uruchom Visual Studio, wybierz „Create a new project„,
  2. Wpisz „MAUI” w pole wyszukiwania, wybierz szablon „.NET MAUI App”,
  3. Podaj nazwę, lokalizację, wybierz najnowszą wersję .NET Framework – zgodnie z konwencjami .NET,
  4. Po utworzeniu projektu NuGet automatycznie pobierze wszystkie wymagane zależności.

Pierwsze uruchomienie wymaga wyboru platformy z dostępnej listy:

  • w przypadku Windows: Windows Machine – natychmiastowe uruchomienie na lokalnym komputerze,
  • dla Androida: gotowe emulatory lub fizyczne urządzenie,
  • dla iOS: symulator po połączeniu z hostem Mac.

Domyślny szablon demonstruje podstawy data binding i obsługi zdarzeń przez prostą stronę z przyciskiem zliczającym kliknięcia. To idealny punkt wyjścia do nauki architektury MAUI i programistycznych wzorców platformy.

Fundamenty XAML i projektowanie interfejsu użytkownika

XAML to podstawowy język znaczników w .NET MAUI – umożliwia opis struktur i wyglądu UI w deklaratywny sposób. Kod XAML jest czytelny, łatwy do utrzymania i pozwala oddzielić logikę prezentacji od logiki biznesowej.

Plik XAML zbudowany jest z trzech sekcji:

  • namespace – określa przestrzeń nazw,
  • root element – np. ContentPage, TabbedPage (typ strony/układu),
  • hierarchia kontrolek UI wraz z properties (wygląd i zachowanie).

Data binding łączy kontrolki UI z danymi w ViewModelach: zmiany danych automatycznie odświeżają interfejs. Możesz stosować ścieżki, konwertery i złożone wyrażenia binding, co daje dużą elastyczność w prezentacji danych.

W XAML masz też dostęp do rozszerzeń znaczników:

  • {StaticResource} – odwołania do globalnych zasobów;
  • {Binding} – deklaratywne powiązania danych;
  • {x:Static} – dostęp do statycznych właściwości;
  • {OnPlatform} – ułatwia dostosowanie UI do danej platformy.

Dzięki mechanizmom platform-specific możesz z jednego pliku XAML dostosować wygląd i funkcje interfejsu na każdą platformę.

Architektura aplikacji i wzorzec MVVM

Model-View-ViewModel (MVVM) to rekomendowany wzorzec dla MAUI. Dzieli aplikację na Model (dane domeny), View (interfejs) oraz ViewModel (logika interakcji i komunikacja między UI a danymi). Taki podział upraszcza rozwój, testowanie i pozwala na 'czysty kod’.

Podstawowe warstwy architektury MVVM w MAUI:

  • Model – klasy odwzorowujące dane i usługi, logika domeny bez referencji do UI;
  • ViewModel – udostępnia właściwości i komendy do powiązań z UI, implementuje INotifyPropertyChanged (najlepiej z biblioteki CommunityToolkit.Mvvm dla automatyzacji powiadomień);
  • View – opisuje UI w XAML z powiązaniami do ViewModel.

Implementacja komend MVVM korzysta z interfejsu ICommand, z wygodnymi RelayCommandami (CommunityToolkit.Mvvm). Komendy mogą automatycznie aktywować/dezaktywować elementy UI na podstawie warunku CanExecute.

Dependency injection w MAUI ułatwia zarządzanie zależnościami:

  • wszystkie usługi, ViewModele, klasy pomocnicze rejestrujesz w MauiProgram.cs;
  • DI działa zgodnie z wzorcami .NET i pozwala na podmianę zależności przy testowaniu lub rozwoju;
  • Prawidłowo wdrożony DI znacznie usprawnia testy i rozwój zespołowy.

Zarządzanie konfiguracją aplikacji

W .NET MAUI możesz konfigurować ustawienia aplikacji na kilka sposobów. Najczęściej wykorzystuje się plik appsettings.json (w stylu ASP.NET Core), gdzie przechowywane są ustawienia, endpointy API czy feature flagi.

Wdrożenie pliku appsettings.json w MAUI obejmuje:

  • zarejestrowanie pliku jako embedded resource;
  • wczytanie go przez ConfigurationBuilder w MauiProgram.cs;
  • utworzenie klas konfiguracyjnych zgodnych z jego hierarchią;
  • rejestrację klas konfiguracyjnych jako usług w DI dla łatwej iniekcji.

Przykładowa konfiguracja w MauiProgram.cs:

public static class MauiProgram {
public static MauiApp CreateMauiApp() {
var builder = MauiApp.CreateBuilder();
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(MauiProgram)).Assembly;
var stream = assembly.GetManifestResourceStream("MyApp.appsettings.json");
var config = new ConfigurationBuilder().AddJsonStream(stream).Build();
builder.Configuration.AddConfiguration(config);
return builder.Build();
}
}

Możesz też wykorzystać plik config.json w folderze Resources/Raw – idealnie nadaje się do kluczy API lub danych wrażliwych. Pliki Raw są dołączane do aplikacji jako zasoby i dostępne przez FileSystem API.

Konfiguracje środowiskowe (np. Debug/Release, różne platformy) zrealizujesz przez conditional compilation lub oddzielne pliki konfiguracyjne. Prawidłowe zarządzanie konfiguracją daje elastyczność i bezpieczeństwo w różnych środowiskach wdrożeniowych.

Nawigacja i architektura Shell

Shell to zaawansowany framework do zarządzania nawigacją w MAUI. Definiujesz hierarchię i strukturę przez deklaratywne XAML – Shell automatycznie generuje menu, zakładki i treść zgodną z platformą.

Przykładowa definicja Shell:








Nawigację w kodzie realizujesz metodą Shell.Current.GoToAsync() z parametrami URI. Możliwe jest przekazywanie parametrów trasy, które automatycznie mapowane są na strony docelowe przez QueryProperty.

Alternatywą dla Shell są klasyczne wzorce nawigacji:

  • NavigationPage – hierarchiczna nawigacja, zarządzanie stosem stron,
  • FlyoutPage – klasyczne menu boczne,
  • TabbedPage – układ oparty na zakładkach.

Zaawansowane funkcjonalności i narzędzia społeczności

.NET MAUI Community Toolkit rozszerza możliwości platformy o dodatkowe animacje, kontrolki, konwertery i behaviors. Dzięki temu możesz szybko dodawać popularne funkcje bez pisania własnych implementacji.

Toolkit aktywujesz w MauiProgram.cs przez:

builder.UseMauiCommunityToolkit();

Komponent Popup umożliwia tworzenie zaawansowanych okien dialogowych i nakładek:


await this.ShowPopupAsync(
new Label { Text = "To jest bardzo ważna wiadomość!" },
new PopupOptions
{
CanBeDismissedByTappingOutsideOfPopup = false,
Shape = new RoundRectangle { CornerRadius = new CornerRadius(20,20,20,20), StrokeThickness = 2, Stroke = Colors.LightGray }
}
);

Resource Dictionaries centralizują obsługę stylów, kolorów i szablonów. Możesz dynamicznie ładować pliki stylów lub łączyć kilka źródeł zasobów przez merged dictionaries.

Integrację map ułatwia biblioteka Microsoft.Maui.Maps z kontrolkami do obsługi markerów, tras i danych geolokalizacyjnych. Własne renderery map rozszerzają te możliwości według potrzeb aplikacji.

Hot Reload, Live Visual Tree i Property Explorer to kluczowe narzędzia przyspieszające projektowanie UI i diagnostykę problemów graficznych na bieżąco.

Zarządzanie cyklem życia i optymalizacja wydajności

Zarządzanie cyklem życia aplikacji obejmuje obsługę uniwersalnych zdarzeń: Created, Activated, Deactivated, Stopped i Resumed. Stabilność i szybkość aplikacji zależą od prawidłowej reakcji na te zdarzenia.

Centralną konfigurację eventów cyklu życia ustawiasz w MauiProgram.cs przez ConfigureLifecycleEvents. Do typowych zadań należą:

  • zapisywanie stanu aplikacji,
  • zwalnianie zasobów,
  • odświeżanie danych i obsługa zadań w tle w zależności od platformy.

Przykład rejestracji eventów cyklu życia:


public static MauiApp CreateMauiApp() {
var builder = MauiApp.CreateBuilder();
builder.ConfigureLifecycleEvents(events => {
events.AddAndroid(android => android
.OnApplicationCreate((app) => LogEvent("Application Created"))
.OnActivityResume((activity) => LogEvent("Activity Resumed")));
events.AddiOS(ios => ios
.DidEnterBackground((app) => LogEvent("Entered Background"))
.WillEnterForeground((app) => LogEvent("Entering Foreground")));
});
return builder.Build();
}

Optymalizację wydajności realizujesz przez:

  • korzystanie z compiled bindings, minimalizację złożoności powiązań danych,
  • odpowiedni dobór kontenerów układu i płytką hierarchię UI,
  • stosowanie wirtualizacji i lazy loading w dużych kolekcjach danych,
  • wdrożenie IDisposable w ViewModels do czyszczenia subskrypcji i pamięci.

Testowanie i debugowanie aplikacji MAUI

Unit tests w MAUI bazują na standardowych frameworkach .NET: MSTest, NUnit, xUnit. ViewModel można łatwo testować w izolacji przez podmianę zależności i sprawdzanie bindingów oraz komend.

Testy integracyjne i automatyczne testy UI obsłużysz przez Xamarin.UITest i podobne narzędzia, testując zachowanie nawigacji, trwałość danych i komunikację sieciową.

Narzędzia debugowania w Visual Studio zostały rozbudowane o funkcje specyficzne dla urządzeń – Hot Reload, Live Visual Tree i Property Explorer ułatwiają szybkie iteracje oraz inspekcję struktury UI w czasie rzeczywistym. Android Debug Bridge (ADB) oraz Xcode Instruments przydatne są przy zaawansowanym profilowaniu wydajności.

Profilowanie aplikacji z użyciem narzędzi natywnych pozwala monitorować pamięć, CPU oraz sieć specyficznie dla każdej platformy.

Wdrażanie i dystrybucja aplikacji

Proces wdrażania uzależniony jest od platformy:

  • Android – wymaga podpisu certyfikatem, odpowiednich uprawnień i zgodności ze standardami Google Play; testowanie na wielu typach urządzeń i wersjach Androida jest kluczowe,
  • iOS – wymaga konta Apple Developer, certyfikatów i profili provisioning oraz przejścia przez proces TestFlight przed publikacją w App Store; na macOS dodatkowe ograniczenia dot. dystrybucji przez Mac App Store lub bezpośrednio,
  • Windows – różne kanały: Microsoft Store (MSIX), instalatory MSI lub EXE; MSIX gwarantuje nowoczesną dystrybucję, automatyczne aktualizacje i bezpieczeństwo.

Wieloplatformowe pipeline’y CI/CD możesz zbudować w Azure DevOps, GitHub Actions lub innych narzędziach – automatyzacja kompilacji, testowania, podpisywania i wdrażania na wszystkie platformy jest w zasięgu ręki. Zarządzanie certyfikatami i kluczami jest kluczowe dla bezpieczeństwa pipeline’u.