Úvod do .NET MAUI 10
Keď Microsoft v novembri 2025 vydal .NET 10, priniesol so sebou aj .NET MAUI 10 — a úprimne, tentokrát to nie je len o nových funkciách. Hlavný dôraz sa presunul na niečo, čo komunita dlho volala: kvalitu, výkon a celkový zážitok z vývoja. Tím sa namiesto pridávania experimentálnych vecí sústredil na vyladenie existujúcich komponentov, opravy chýb a citeľné zlepšenie výkonu.
A čo je ešte dôležitejšie — .NET 10 je verzia s dlhodobou podporou (LTS). To znamená tri roky podpory. Pre nás vývojárov mobilných a desktopových appiek to prináša pokoj na duši, že máme stabilnú platformu, na ktorej môžeme stavať s istotou.
Tak poďme sa pozrieť, čo všetko nového .NET MAUI 10 prináša. Od revolučného XAML Source Generátora, cez vylepšenia CollectionView, až po integráciu s .NET Aspire a natívnu AOT kompiláciu pre iOS. Ku každej funkcii prikladám aj praktické príklady kódu, aby ste mohli novinky rovno vyskúšať.
XAML Source Generator — a konečne poriadne rýchly XAML
Toto je podľa mňa najväčšia vec v celom vydaní. XAML Source Generator je nový zdrojový generátor, ktorý úplne mení spôsob spracovania XAML súborov. Namiesto toho, aby sa XAML parsoval za behu aplikácie, generuje sa z neho silne typovaný C# kód už počas kompilácie.
Výsledok? Rýchlejšia aplikácia, lepšie chybové hlášky a konzistentné správanie medzi Debug a Release.
Ako XAML Source Generator funguje
Doteraz .NET MAUI riešil XAML dvoma spôsobmi — v Debug režime sa parsoval za behu, v Release sa kompiloval cez XamlC. Nový Source Generator oba tieto prístupy nahrádza jedným: generuje silne typovaný C# kód pre každý XAML súbor počas kompilácie. Žiadny runtime parser, žiadne rozdiely medzi Debug a Release.
Výkonnostné prínosy
- 100x rýchlejšia inflácia v Debug režime — namiesto runtime parsovania sa používa vygenerovaný kód (áno, stokrát)
- 25% rýchlejšia inflácia v Release režime — oproti štandardnej XamlC kompilácii
- Detekcia chýb v čase kompilácie — syntaktické aj sémantické chyby v XAML sa odhalia ešte pred spustením
- Konzistentné správanie — rovnaký vygenerovaný kód v Debug aj Release
- Inšpekcia vygenerovaného kódu — môžete si pozrieť, aký C# kód sa z vášho XAML generuje
Aktivácia XAML Source Generátora
Máte dva spôsoby, ako ho zapnúť — na úrovni celého projektu alebo pre jednotlivé súbory.
Spôsob 1: Aktivácia na úrovni projektu
Najjednoduchšie je nastaviť vlastnosť MauiXamlInflator v súbore .csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net10.0-android;net10.0-ios;net10.0-maccatalyst</TargetFrameworks>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<MauiXamlInflator>SourceGen</MauiXamlInflator>
<!-- Voliteľné: zobrazenie vygenerovaného kódu -->
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>
</Project>
Spôsob 2: Aktivácia na úrovni jednotlivých súborov
Ak chcete mať presnejšiu kontrolu, môžete Source Generator nastaviť len pre vybrané XAML súbory:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net10.0-android;net10.0-ios;net10.0-maccatalyst</TargetFrameworks>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<ItemGroup>
<MauiXaml Update="**/*.xaml" Inflator="SourceGen" />
</ItemGroup>
</Project>
Konfigurácia v MauiProgram.cs
Okrem nastavenia v projektovom súbore nezabudnite pridať assembly atribút do MauiProgram.cs:
using Microsoft.Maui.Controls.Xaml;
[assembly: XamlProcessing(XamlInflator.SourceGen)]
namespace MojaAplikacia;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
return builder.Build();
}
}
Úprava code-behind súborov
V každom code-behind súbore (*.xaml.cs) je potrebné zmeniť volanie InitializeComponent() na InitializeComponentSourceGen(). Je to drobná zmena, ale ľahko sa na ňu zabudne:
namespace MojaAplikacia;
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponentSourceGen();
}
private void OnPocitadloClicked(object sender, EventArgs e)
{
// Logika tlačidla
}
}
Podpora C# výrazov v XAML
Ďalšia výhoda Source Generátora, ktorá ma osobne potešila, je podpora priamych C# výrazov v XAML. Vďaka tomu je markup flexibilnejší:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MojaAplikacia.MainPage">
<VerticalStackLayout Padding="20">
<Label Text="Vitajte v .NET MAUI 10"
FontSize="24"
HorizontalOptions="Center" />
<Label Text="{x:String Format='Dnes je {0:dd.MM.yyyy}',
Source={x:Static system:DateTime.Now}}"
FontSize="16"
HorizontalOptions="Center" />
</VerticalStackLayout>
</ContentPage>
CollectionView a CarouselView — konečne bez problémov
Ak ste niekedy bojovali s CollectionView na iOS (a kto z nás nie), mám dobrú správu. V .NET 9 boli predstavené nové handlery pre CollectionView a CarouselView na iOS a Mac Catalyst ako voliteľné. V .NET MAUI 10 sa tieto vylepšené handlery stávajú predvolenými. Takže zlepšenie výkonu dostanete zadarmo, bez jediného riadku zmeny v kóde.
Kľúčové vylepšenia
- Plynulejší scrollovanie — výrazne lepšia odozva pri posúvaní veľkých kolekcií
- Efektívnejšia správa pamäte — znížená spotreba RAM pri veľkom množstve položiek
- Stabilnejšie vykresľovanie — menej pádov a vizuálnych artefaktov
- Vylepšená aktualizácia výberu — spoľahlivejšie sledovanie vybraných položiek
- Lepšia správa placeholder farieb — konzistentný vizuál naprieč platformami
Praktický príklad CollectionView
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MojaAplikacia.ProduktPage">
<CollectionView ItemsSource="{Binding Produkty}"
SelectionMode="Single"
SelectionChanged="OnVyberZmeneny">
<CollectionView.ItemsLayout>
<LinearItemsLayout Orientation="Vertical"
ItemSpacing="10" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<Border StrokeShape="RoundRectangle 8"
Padding="12"
Margin="8,0">
<HorizontalStackLayout Spacing="12">
<Image Source="{Binding ObrazokUrl}"
WidthRequest="60"
HeightRequest="60"
Aspect="AspectFill" />
<VerticalStackLayout VerticalOptions="Center">
<Label Text="{Binding Nazov}"
FontSize="16"
FontAttributes="Bold" />
<Label Text="{Binding Cena, StringFormat='{0:C}'}"
FontSize="14"
TextColor="Gray" />
</VerticalStackLayout>
</HorizontalStackLayout>
</Border>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</ContentPage>
Návrat k starším handlerom
Ak by ste z nejakého dôvodu potrebovali vrátiť sa k pôvodným handlerom (čo by som neodporúčal, ale stať sa môže všeličo), dá sa to v MauiProgram.cs:
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureMauiHandlers(handlers =>
{
#if IOS || MACCATALYST
// Návrat k starším handlerom (neodporúča sa)
handlers.AddHandler<CollectionView,
Microsoft.Maui.Controls.Handlers.Items.CollectionViewHandler>();
handlers.AddHandler<CarouselView,
Microsoft.Maui.Controls.Handlers.Items.CarouselViewHandler>();
#endif
});
return builder.Build();
}
SafeAreaEdges — kontrola nad výrezmi a rohmi displeja
Moderné telefóny sú plné výrezov pre kamery, zaoblených rohov a navigačných indikátorov. Doteraz bola práca s bezpečnými oblasťami v MAUI trochu... nepríjemná. .NET MAUI 10 prináša nový systém cez vlastnosť SafeAreaEdges, ktorý dáva vývojárom oveľa granulárnejšiu kontrolu.
Hodnoty enum SafeAreaEdges
- None — edge-to-edge obsah bez akéhokoľvek odsadenia. Obsah sa môže rozšíriť za systémové lišty, výrezy aj klávesnicu
- SoftInput — rešpektuje len softvérovú klávesnicu. Obsah ide pod lišty a výrezy, ale vyhne sa prekrytiu klávesnicou
- Container — rešpektuje bezpečné oblasti kontajnera (systémové lišty, výrezy), ale obsah sa môže rozšíriť pod klávesnicu
- Default — predvolené správanie pre daný typ ovládacieho prvku
- All — rešpektuje všetko — systémové lišty, výrezy aj klávesnicu
Dostupnosť na ovládacích prvkoch
Vlastnosť SafeAreaEdges je dostupná na týchto prvkoch:
- Layout (a odvodené layouty — Grid, VerticalStackLayout, HorizontalStackLayout) — predvolená hodnota:
Container - ContentView
- ContentPage — predvolená hodnota:
None(edge-to-edge) - Border
- ScrollView
Praktické príklady použitia
Povedzme, že robíte prihlasovaciu stránku s obrázkom na pozadí — chcete edge-to-edge dizajn, ale zároveň aby vstupné polia neboli pod výrezom:
<!-- Stránka s edge-to-edge dizajnom, obsah rešpektuje kontajner -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MojaAplikacia.PrihlasenieStranka"
SafeAreaEdges="None">
<Grid SafeAreaEdges="Container">
<Image Source="pozadie.jpg" Aspect="AspectFill" />
<VerticalStackLayout
VerticalOptions="Center"
Padding="20"
SafeAreaEdges="All">
<Entry Placeholder="E-mail"
Keyboard="Email" />
<Entry Placeholder="Heslo"
IsPassword="True" />
<Button Text="Prihlásiť sa"
Margin="0,20,0,0" />
</VerticalStackLayout>
</Grid>
</ContentPage>
Pre formuláre, kde potrebujete reagovať na zobrazenie klávesnice, je kľúčové správne nastaviť SafeAreaEdges:
<!-- ScrollView s reakciou na klávesnicu -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MojaAplikacia.FormularStranka">
<Grid SafeAreaEdges="SoftInput">
<ScrollView>
<VerticalStackLayout Padding="20" Spacing="15">
<Label Text="Registračný formulár"
FontSize="24" FontAttributes="Bold" />
<Entry Placeholder="Meno" />
<Entry Placeholder="Priezvisko" />
<Entry Placeholder="E-mail" Keyboard="Email" />
<Entry Placeholder="Telefón" Keyboard="Telephone" />
<Editor Placeholder="Poznámka" HeightRequest="120" />
<Button Text="Odoslať" />
</VerticalStackLayout>
</ScrollView>
</Grid>
</ContentPage>
Native AOT na iOS a Mac Catalyst
Native Ahead-of-Time (AOT) kompilácia je niečo, na čo sa veľa vývojárov tešilo. Umožňuje vytvárať výrazne menšie a rýchlejšie appky pre iOS a Mac Catalyst. V .NET MAUI 10 bola táto technológia ďalej vylepšená a stabilizovaná.
Výhody Native AOT
- Až 50% menšie aplikácie — drastické zníženie veľkosti balíkov vďaka eliminácii nepotrebného kódu
- Až 50% rýchlejší štart — natívny kód sa spúšťa okamžite, žiadna JIT kompilácia
- Rýchlejší build čas — v porovnaní s klasickým AOT
- Predvídateľný výkon — žiadne oneskorenia spôsobené JIT za behu
Ako Native AOT funguje
Pri tradičnom nasadení .NET MAUI používa Mono runtime s JIT kompiláciou — kód sa kompiluje do natívnych inštrukcií až za behu. Native AOT to obracia: celý kód sa skompiluje do natívnych strojových inštrukcií ešte pred distribúciou. Výsledný balík teda obsahuje priamo natívny kód bez potreby runtime kompilátora.
Počas vývoja ale vaša appka stále beží na Mono runtime. Takže debugujete normálne a Native AOT zapnete až pre produkčné buildy. Celkom rozumný prístup.
Konfigurácia v projektovom súbore
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net10.0-ios;net10.0-maccatalyst</TargetFrameworks>
<PublishAot>true</PublishAot>
<!-- Voliteľné: optimalizácia na veľkosť alebo rýchlosť -->
<OptimizationPreference>Size</OptimizationPreference>
</PropertyGroup>
</Project>
Publikovanie s Native AOT
Pre vytvorenie Native AOT aplikácie musíte použiť dotnet publish. Bežný dotnet build AOT verziu nevytvorí — na to pozor:
# Publikovanie pre iOS s Native AOT
dotnet publish -f net10.0-ios -c Release
# Publikovanie pre Mac Catalyst s Native AOT
dotnet publish -f net10.0-maccatalyst -c Release
Obmedzenia a upozornenia
Native AOT nie je bez kompromisov. Tu je pár vecí, na ktoré si treba dať pozor:
- Trimming kompatibilita — všetok kód musí byť kompatibilný s trimovaním. Reflexia a dynamické načítavanie typov môžu robiť problémy
- Knižnice tretích strán — nie všetky NuGet balíky sú AOT kompatibilné. Overte si to vopred
- Dynamický kód —
System.Reflection.Emita dynamická generácia typov nie sú podporované - Serializácia — niektoré serializačné knižnice vyžadujú špeciálnu konfiguráciu
Pre overenie AOT kompatibility pridajte do projektu tieto nastavenia:
<PropertyGroup>
<PublishAot>true</PublishAot>
<!-- Zobrazenie trimovacích varovaní počas buildu -->
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
<TrimmerSingleWarn>false</TrimmerSingleWarn>
<!-- Povolenie AOT analýzy -->
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
<EnableAotAnalyzer>true</EnableAotAnalyzer>
</PropertyGroup>
Android vylepšenia
.NET MAUI 10 prináša aj niekoľko dôležitých zmien pre Android. Nie sú také dramatické ako XAML Source Generator, ale rozhodne stoja za pozornosť.
MauiAppCompatEditText nahrádza AppCompatEditText
Na Androide sa natívne zobrazenie pre Entry a Editor mení z AppCompatEditText na nový MauiAppCompatEditText. Hlavná novinka? Podpora udalosti SelectionChanged.
Vďaka tomu sa pri zmene výberu textu automaticky aktualizujú vlastnosti CursorPosition a SelectionLength:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MojaAplikacia.EditorStranka">
<VerticalStackLayout Padding="20" Spacing="10">
<Editor x:Name="textEditor"
Placeholder="Zadajte text..."
HeightRequest="200"
CursorPosition="0"
SelectionLength="0" />
<Label x:Name="infoLabel"
Text="Pozícia kurzora: 0, Dĺžka výberu: 0" />
</VerticalStackLayout>
</ContentPage>
public partial class EditorStranka : ContentPage
{
public EditorStranka()
{
InitializeComponent();
// Reagovanie na zmenu výberu textu
textEditor.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(Editor.CursorPosition) ||
e.PropertyName == nameof(Editor.SelectionLength))
{
infoLabel.Text = $"Pozícia kurzora: {textEditor.CursorPosition}, " +
$"Dĺžka výberu: {textEditor.SelectionLength}";
}
};
}
}
Podpora Android API 36 a JDK 21
.NET MAUI 10 štandardne cieli na Android API 36 (Android 16) a pridáva podporu pre JDK 21. Pri existujúcich projektoch nezabudnite aktualizovať cieľové platformy:
<PropertyGroup>
<TargetFrameworks>net10.0-android;net10.0-ios;net10.0-maccatalyst</TargetFrameworks>
<!-- Android API 36 je predvolené pre net10.0-android -->
<SupportedOSPlatformVersion
Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">24.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion
Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">16.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion
Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">16.0</SupportedOSPlatformVersion>
</PropertyGroup>
HybridWebView vylepšenia
HybridWebView umožňuje vkladať webový obsah do natívnych MAUI appiek a v .NET MAUI 10 dostáva niekoľko zaujímavých vylepšení.
Nový overload InvokeJavaScriptAsync
Nový overload metódy InvokeJavaScriptAsync umožňuje volať JavaScript funkcie bez špecifikácie návratového typu. Jednoduché a praktické — presne to, čo ste potrebovali, keď ste nepotrebovali návratovú hodnotu:
public partial class WebStranka : ContentPage
{
public WebStranka()
{
InitializeComponent();
}
private async void OnZiskajDataClicked(object sender, EventArgs e)
{
// Nový overload - volanie bez špecifikácie návratového typu
await hybridWebView.InvokeJavaScriptAsync("aktualizujUI");
// Existujúci overload - volanie so špecifikáciou návratového typu
var vysledok = await hybridWebView.InvokeJavaScriptAsync<string>(
"ziskajMeno",
HybridWebViewInvokeJavaScriptTarget.MainPage);
menoLabel.Text = $"Meno z JavaScriptu: {vysledok}";
}
private async void OnOdoslatParametreClicked(object sender, EventArgs e)
{
// Volanie s parametrami
var parametre = new object[] { "Jan", "Novak", 30 };
var jsonParametre = parametre.Select(p =>
System.Text.Json.JsonSerializer.Serialize(p)).ToArray();
var vysledok = await hybridWebView.InvokeJavaScriptAsync<string>(
"spracujPouzivatela",
HybridWebViewInvokeJavaScriptTarget.MainPage,
jsonParametre);
}
}
Zachytávanie web požiadaviek
Nová funkcia zachytávania požiadaviek (Request Interception) umožňuje monitorovať a modifikovať webové požiadavky, ktoré WebView vykonáva. Hodí sa napríklad na pridávanie autentifikačných hlavičiek, presmerovanie požiadaviek alebo blokovanie nežiaducich zdrojov.
MediaPicker vylepšenia
Trieda MediaPicker v .NET MAUI 10 dostáva dve dlho očakávané funkcie: výber viacerých súborov naraz a kompresiu obrázkov. Konečne.
Výber viacerých súborov
Nová funkcia umožňuje používateľom vybrať viacero fotografií alebo videí naraz. Ak ste doteraz museli riešiť multi-select vlastnou implementáciou, toto vám ušetrí dosť času:
public partial class GaleriaStranka : ContentPage
{
public ObservableCollection<ObrazokModel> VybraneObrazky { get; } = new();
public GaleriaStranka()
{
InitializeComponent();
BindingContext = this;
}
private async void OnVybratFotkyClicked(object sender, EventArgs e)
{
try
{
var vysledky = await MediaPicker.Default.PickMultiplePhotoAsync(
new MediaPickerOptions
{
Title = "Vyberte fotografie"
});
if (vysledky != null)
{
foreach (var subor in vysledky)
{
var stream = await subor.OpenReadAsync();
var obrazok = ImageSource.FromStream(() => stream);
VybraneObrazky.Add(new ObrazokModel
{
Zdroj = obrazok,
NazovSuboru = subor.FileName
});
}
}
}
catch (PermissionException)
{
await DisplayAlert("Chyba",
"Aplikácia nemá oprávnenie na prístup ku galérii.", "OK");
}
}
}
Kompresia obrázkov
MediaPicker teraz podporuje aj automatickú kompresiu obrázkov. Ak nahrávate fotky na server alebo pracujete s obmedzeným úložiskom, toto oceníte:
private async void OnVybratAKompresovatClicked(object sender, EventArgs e)
{
var vysledky = await MediaPicker.Default.PickMultiplePhotoAsync(
new MediaPickerOptions
{
Title = "Vyberte fotografie",
MaximumWidth = 1024,
MaximumHeight = 768
});
if (vysledky != null)
{
foreach (var subor in vysledky)
{
var stream = await subor.OpenReadAsync();
await NahrajNaServer(stream, subor.FileName);
}
}
}
private async Task NahrajNaServer(Stream stream, string nazovSuboru)
{
using var httpClient = new HttpClient();
var obsah = new MultipartFormDataContent();
obsah.Add(new StreamContent(stream), "subor", nazovSuboru);
var odpoved = await httpClient.PostAsync(
"https://api.mojserver.sk/upload", obsah);
odpoved.EnsureSuccessStatusCode();
}
Integrácia s .NET Aspire
.NET Aspire je framework pre cloudové aplikácie, ktorý zjednodušuje konfiguráciu služieb, telemetriu a service discovery. A teraz sa dá jednoducho prepojiť s MAUI appkami. Pre tých z vás, ktorí pracujú s microservices architektúrou, je to pomerne veľká vec.
Vytvorenie projektu s Aspire integráciou
Nová šablóna projektu to robí jednoduchým:
# Vytvorenie MAUI Service Defaults projektu
dotnet new maui-aspire-servicedefaults -n MojaApp.MauiServiceDefaults
Konfigurácia v MauiProgram.cs
Po vytvorení projektu stačí pridať volanie AddServiceDefaults():
using Microsoft.Extensions.DependencyInjection;
namespace MojaAplikacia;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
// Pridanie Aspire service defaults
builder.AddServiceDefaults();
// Konfigurácia HTTP klienta s service discovery
builder.Services.AddHttpClient<ApiService>(client =>
{
client.BaseAddress = new Uri("https+http://moj-api");
});
return builder.Build();
}
}
OpenTelemetry metriky a trasovanie
Integrácia s Aspire automaticky pridáva OpenTelemetry metriky a trasovanie. V súbore Extensions.cs Service Defaults projektu môžete odkomentovať riadky pre pridanie Microsoft.Maui ako zdroja:
public static IHostApplicationBuilder ConfigureOpenTelemetry(
this IHostApplicationBuilder builder)
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation();
// Odkomentujte pre MAUI metriky
// metrics.AddMeter("Microsoft.Maui");
})
.WithTracing(tracing =>
{
tracing.AddHttpClientInstrumentation();
// Odkomentujte pre MAUI trasovanie
// tracing.AddSource("Microsoft.Maui");
});
return builder;
}
Výhody integrácie s Aspire
- Automatické service discovery — MAUI appka automaticky nájde a pripojí sa k lokálnym službám bez pevne zadaných URL
- Zjednodušená konfigurácia siete — žiadne manuálne riešenie
10.0.2.2pre Android emulátor alebo problémy s certifikátmi - Centralizovaná telemetria — metriky, logy a trasovanie z MAUI appky sa zobrazujú v Aspire dashboarde
- Resilientné HTTP volania — automatické opakovanie požiadaviek a circuit breaker vzor
Migrácia na .NET MAUI 10
Ak máte existujúci projekt v .NET MAUI 9, migrácia na desiatku je relatívne priamočiara. Ale pár vecí si predsa len vyžaduje pozornosť.
Krok 1: Inštalácia .NET 10 SDK
Najskôr nainštalujte .NET 10 SDK a MAUI workload:
# Inštalácia MAUI workloadu
dotnet workload install maui
# Overenie inštalácie
dotnet --list-sdks
dotnet workload list
Krok 2: Aktualizácia Target Framework
V .csproj súbore zmeňte cieľové frameworky z .NET 9 na .NET 10:
<!-- Pred migráciou (.NET 9) -->
<PropertyGroup>
<TargetFrameworks>net9.0-android;net9.0-ios;net9.0-maccatalyst</TargetFrameworks>
</PropertyGroup>
<!-- Po migrácii (.NET 10) -->
<PropertyGroup>
<TargetFrameworks>net10.0-android;net10.0-ios;net10.0-maccatalyst</TargetFrameworks>
</PropertyGroup>
Krok 3: Aktualizácia NuGet balíkov
Aktualizujte všetky Microsoft.Maui NuGet balíky na .NET 10 kompatibilné verzie:
# Obnovenie závislostí
dotnet restore
# Manuálna aktualizácia konkrétnych balíkov
dotnet add package Microsoft.Maui.Controls --version 10.0.*
dotnet add package Microsoft.Extensions.Logging.Debug --version 10.0.*
Krok 4: Riešenie breaking changes
Tu sú najdôležitejšie zmeny, na ktoré si dajte pozor:
- ListView a TableView sú obsolete —
ListView,TableViewa všetky typyCellsú označené ako zastarané. Migrácia naCollectionViewje teraz viac než odporúčaná - CollectionView handlery — nové handlery sú predvolené na iOS/Mac Catalyst. Ak máte vlastné handler customizácie, overte kompatibilitu
- Android EditText zmena —
AppCompatEditTextsa mení naMauiAppCompatEditText. Aktualizujte referencie, ak pristupujete k natívnym Android views priamo - Android SDK — API 36 je nový predvolený target. Uistite sa, že máte nainštalovaný príslušný Android SDK
Krok 5: Dôkladné testovanie
Po migrácii dôkladne otestujte celú aplikáciu na všetkých cieľových platformách. Zamerajte sa hlavne na:
- Správanie CollectionView a CarouselView (nové predvolené handlery)
- Zobrazenie stránok s ohľadom na SafeAreaEdges
- Funkčnosť textových vstupov na Androide (nový MauiAppCompatEditText)
- Kompatibilitu knižníc tretích strán s .NET 10
- Výkon pri štarte a počas používania
Záver
.NET MAUI 10 je podľa mňa najzrelšie vydanie tohto frameworku doteraz. Namiesto honby za novými funkciami sa tím sústredil na to, čo vývojári naozaj potrebovali — stabilitu, výkon a opravy dlhodobých problémov.
Najväčšie novinky v kocke:
- XAML Source Generator — až 100-násobné zrýchlenie v Debug režime a detekcia chýb pri kompilácii
- Vylepšené CollectionView a CarouselView — nové predvolené handlery na iOS/Mac Catalyst s lepším výkonom
- SafeAreaEdges — konečne granulárna kontrola nad bezpečnými oblasťami
- Native AOT pre iOS — až 50% menšie a rýchlejšie appky
- Integrácia s .NET Aspire — service discovery, telemetria a resilientné HTTP volania
- Android vylepšenia — podpora API 36, nový MauiAppCompatEditText so SelectionChanged
Ako LTS verzia je .NET MAUI 10 solídna voľba pre nové projekty aj migráciu existujúcich appiek. Tri roky podpory dávajú dostatok priestoru na to, aby ste na tejto verzii mohli pokojne stavať.
Pre migráciu z .NET MAUI 9 je prechod relatívne bezbolestný. Najdôležitejšie je myslieť na označenie ListView a TableView ako zastaraných, nové predvolené handlery pre CollectionView a zmenu natívnych Android views pre textové vstupy.
Budúcnosť .NET MAUI vyzerá sľubne. S každým vydaním je framework stabilnejší a príjemnejší na prácu. .NET MAUI 10 je dôkazom, že Microsoft berie multiplatformový vývoj vážne. Či už robíte podnikové appky, spotrebiteľské produkty alebo interné nástroje — .NET MAUI 10 vám dá solídny základ na rok 2026 a ďalej.