2026'da .NET MAUI: Çapraz Platform Geliştirme Rehberi ve Mülakat Soruları
.NET MAUI rehberi: .NET 10 ile çapraz platform geliştirme, handler'lar, MVVM, HybridWebView ve 2026 için temel mülakat soruları.

.NET MAUI (Multi-platform App UI), .NET 10 ile birlikte üretime hazır bir çapraz platform framework olarak olgunlaştı. Kasım 2028'e kadar desteklenen Uzun Vadeli Destek sürümü olarak yayınlanan .NET MAUI 10, workload ve NuGet paketleri olarak dağıtılır, geliştirilmiş kalite, performans ve HybridWebView geliştirmeleri ile SafeAreaEdges gibi yeni API'ler sunar. Bu rehber, çapraz platform uygulama oluşturmayı, MAUI'yi çalıştıran mimariyi ve 2026'da işe alım yöneticilerinin sorduğu mülakat sorularını ele almaktadır.
.NET 10, Kasım 2028'e kadar desteklenen bir Uzun Vadeli Destek sürümüdür. MAUI 10, yeni UI kontrolleri yerine kalite ve performansa odaklanır, bu da onu bugüne kadarki en kararlı MAUI sürümü yapar. Artık bir .NET workload ve NuGet paketleri olarak dağıtılır, proje başına sürüm sabitleme imkanı sunar.
Sıfırdan .NET MAUI 10 Projesi Oluşturma
Çalışan bir MAUI uygulamasına en hızlı yol .NET CLI ile başlar. .NET 10, telemetri ve servis keşfi sağlayan .NET Aspire servis varsayılanlarını içeren güncellenmiş bir proje şablonu sunar.
# Install the MAUI workload (if not already present)
dotnet workload install maui
# Create a new MAUI app
dotnet new maui -n CrossPlatformDemo
cd CrossPlatformDemo
# Run on Android emulator
dotnet build -t:Run -f net10.0-androidTek proje yapısı, platforma özgü kodu bir Platforms/ klasörü altında birleştirirken geri kalanı paylaşır. MauiProgram.cs dosyası, composition root görevi görür; servisler, fontlar ve handler'lar burada kaydedilir.
using Microsoft.Extensions.Logging;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
// Register services for dependency injection
builder.Services.AddSingleton<IApiService, ApiService>();
builder.Services.AddTransient<MainViewModel>();
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder.Build();
}
}MAUI'deki dependency injection, ASP.NET Core ile aynı deseni izler. Singleton servisler uygulama ömrü boyunca devam eder, Transient servisler her istekte oluşturulur ve Scoped servisler dikkat gerektirir çünkü MAUI'de HTTP istekleri gibi yerleşik bir scope kavramı bulunmamaktadır.
Handler'lar: Çapraz Platform Render Mimarisi
MAUI, Xamarin.Forms renderer'larını bir handler mimarisi ile değiştirdi. Handler'lar, her çapraz platform kontrolünü ince bir soyutlama katmanı aracılığıyla yerel karşılığına eşler. Temel fark: handler'lar stateless'tır ve sanal görünümden ayrıştırılmıştır, bu da onları daha hızlı ve özelleştirmesi daha kolay kılar.
using Microsoft.Maui.Handlers;
public class CustomEntryHandler : EntryHandler
{
protected override void ConnectHandler(MauiAppCompatEditText platformView)
{
base.ConnectHandler(platformView);
// Remove the default underline on Android
platformView.SetBackgroundColor(Android.Graphics.Color.Transparent);
}
}
// Register in MauiProgram.cs
builder.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler<Entry, CustomEntryHandler>();
});.NET 10'da Android Entry ve Editor kontrolleri AppCompatEditText'ten MauiAppCompatEditText'e geçiş yaptı ve SelectionChanged olayı için yerel destek eklendi. .NET 9'da tanıtılan geliştirilmiş CollectionView ve CarouselView handler'ları artık iOS ve Mac Catalyst'te varsayılan olarak kullanılmakta ve uzun süredir devam eden kararlılık sorunlarını çözmektedir.
Android 16 Edge-to-Edge: Kırılgan Değişiklik ve Gerekli Düzeltme
Android 16, edge-to-edge görüntüleme için vazgeçme mekanizmasını kaldırır. API 36'yı hedefleyen uygulamalar sistem çubuğu inset'lerini düzgün şekilde işlemelidir, aksi takdirde içerik yanlış render edilir. .NET 10 sessiz bir kırılgan değişiklik getirdi: .NET 9'da ContentPage varsayılan olarak sistem çubuklarına saygı gösteriyordu (Container davranışı), ancak .NET 10 varsayılan olarak edge-to-edge (None) kullanır.
.NET 9'dan .NET 10'a geçiş yapan uygulamalar, Android 15+ üzerinde içeriğin durum çubuğunun veya navigasyon çubuğunun altında render edildiğini görebilir. Düzeltme, önceki davranışı geri yüklemek için SafeAreaEdges'in açıkça ayarlanmasını gerektirir.
Düzeltme, App.xaml'e global bir örtük stil eklemeyi içerir:
<!-- App.xaml -->
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="CrossPlatformDemo.App">
<Application.Resources>
<ResourceDictionary>
<Style TargetType="ContentPage" ApplyToDerivedTypes="True">
<Setter Property="SafeAreaEdges" Value="Container" />
</Style>
</ResourceDictionary>
</Application.Resources>
</Application>SafeAreaEdges enum'u ayrıntılı kontrol sağlar:
None: güvenli alan padding'i olmadan edge-to-edge içerikSoftInput: her zaman klavye için padding ekleContainer: klavyenin altında ak, çubuklar ve çentikten uzak durDefault: platform varsayılan davranışıAll: tüm güvenli alan inset'lerine uy
Bu yaklaşım çalışma zamanında Window Insets API'sini kullanır ve manifest düzeyinde vazgeçmelerin artık çalışmadığı Android 16 ile uyumlu hale getirir.
CommunityToolkit.Mvvm ile MVVM: Boilerplate Kodun Ortadan Kaldırılması
CommunityToolkit.Mvvm kaynak üreteci, MVVM ceremonisinin yaklaşık %80'ini ortadan kaldırır. Manuel INotifyPropertyChanged implementasyonu yok, komut wrapper'ları yok: attribute'lar kod üretimini yönlendirir.
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
public partial class MainViewModel : ObservableObject
{
private readonly IApiService _apiService;
public MainViewModel(IApiService apiService)
{
_apiService = apiService;
}
// Source generator creates the 'Title' property with change notification
[ObservableProperty]
private string _title = string.Empty;
// Source generator creates the 'IsLoading' property
[ObservableProperty]
private bool _isLoading;
// Source generator creates an async ICommand
[RelayCommand]
private async Task LoadDataAsync()
{
IsLoading = true;
try
{
Title = await _apiService.FetchTitleAsync();
}
finally
{
IsLoading = false;
}
}
}XAML, üretilen özellik ve komutlara doğrudan bağlanır:
<!-- MainPage.xaml -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:vm="clr-namespace:CrossPlatformDemo.ViewModels"
x:DataType="vm:MainViewModel">
<VerticalStackLayout Padding="20" Spacing="16">
<Label Text="{Binding Title}"
FontSize="24"
HorizontalOptions="Center" />
<Button Text="Load Data"
Command="{Binding LoadDataCommand}"
IsEnabled="{Binding IsLoading, Converter={StaticResource InverseBoolConverter}}" />
<ActivityIndicator IsRunning="{Binding IsLoading}"
IsVisible="{Binding IsLoading}" />
</VerticalStackLayout>
</ContentPage>x:DataType attribute'u derlenmiş bağlamaları etkinleştirir; bunlar reflection tabanlı bağlamalardan daha hızlıdır ve bağlama yolu yanlış olduğunda derleme zamanı hataları üretir.
.NET mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
.NET 10'da XAML Source Generator
.NET MAUI 10, XAML'i çalışma zamanında ayrıştırmak yerine derleme zamanında derleyen bir XAML source generator sunar. Bu, başlatma performansını artırır ve XAML hatalarını derleme sırasında yakalar.
XAML source generation'ı etkinleştirmek için proje dosyanıza özellik ekleyin:
<PropertyGroup>
<MauiXamlInflator>SourceGen</MauiXamlInflator>
</PropertyGroup>.NET 10 Preview 5 ayrıca şablon xmlns bildirimlerini ortadan kaldıran örtük XML namespace'leri tanıttı. Bir GlobalXmlns.cs dosyası birden fazla namespace'i toplayabilir:
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MyApp.Views")]
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MyApp.Controls")]Bu kurulumla XAML dosyaları daha temiz hale gelir:
<!-- Önce -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:MyApp.Controls"
x:Class="MyApp.MainPage">
<controls:TagView />
</ContentPage>
<!-- Sonra (global xmlns ile) -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/maui/global"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.MainPage">
<TagView />
</ContentPage>.NET 10'da HybridWebView: Yerel ve Web Dünyasının Buluşması
HybridWebView, C# ve JavaScript arasında çift yönlü iletişim sağlarken bir MAUI uygulaması içinde web içeriği barındırmayı mümkün kılar. .NET 10, fire-and-forget JavaScript çağrısı, platforma özgü yapılandırma için başlatma olayları ve web istek yakalama olmak üzere üç yeni yetenek ekler.
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
// Initialization event for platform-specific tweaks
hybridWebView.WebViewInitialized += (sender, args) =>
{
System.Diagnostics.Debug.WriteLine("WebView ready");
};
}
// Call JavaScript from C#
private async void OnCallJsClicked(object sender, EventArgs e)
{
var result = await hybridWebView.InvokeJavaScriptAsync<string>(
"getFormData",
HybridSampleContext.Default.String
);
await DisplayAlertAsync("Result", result, "OK");
}
// Fire-and-forget: no return type needed (.NET 10)
private async void OnResetClicked(object sender, EventArgs e)
{
await hybridWebView.InvokeJavaScriptAsync("resetForm");
}
}InvokeJavaScriptAsync sırasında fırlatılan JavaScript istisnaları artık otomatik olarak .NET'e istisna olarak yönlendirilir ve sessiz hataları ortadan kaldırır. Web istek yakalama, header'ları değiştirmeye veya yerel yanıtlar sağlamaya olanak tanır:
webView.WebResourceRequested += (s, e) =>
{
if (e.Uri.ToString().Contains("api/secure"))
{
e.Handled = true;
e.SetResponse(200, "OK", "application/json", GetCustomStream());
}
};Kullanımdan Kaldırılan API'ler ve Geçiş Yolu
.NET MAUI 10 birkaç API'yi kullanımdan kaldırır. Bu öğeleri kullanan uygulamalar önerilen alternatiflere geçiş yapmalıdır.
ListView ve ilgili hücreler: ListView, EntryCell, ImageCell, SwitchCell, TextCell ve ViewCell kullanımdan kaldırıldı. Yeni iOS/Mac Catalyst handler'ları ile daha iyi performans ve kararlılık sunan CollectionView kullanılmalıdır.
MessagingCenter: .NET 10'da internal yapıldı. CommunityToolkit.Mvvm'den WeakReferenceMessenger ile değiştirilmelidir.
Animasyon metodları: FadeTo, RotateTo, ScaleTo ve benzeri metodlar kullanımdan kaldırıldı. Async karşılıkları kullanılmalıdır: FadeToAsync, RotateToAsync, ScaleToAsync.
TableView: CollectionView lehine kullanımdan kaldırıldı.
DisplayAlert/DisplayActionSheet: DisplayAlertAsync ve DisplayActionSheetAsync ile değiştirildi.
Xamarin.Forms'tan .NET MAUI'ye Geçiş
Xamarin.Forms'un desteği Mayıs 2024'te sona erdi. MAUI'ye geçiş, basit bir namespace değişikliğinin ötesinde yapısal değişiklikler gerektirir. Gerçek proje dönüşümlerine dayanan bir geçiş kontrol listesi:
Xamarin.Forms, Mayıs 2024'ten bu yana desteklenmemektedir. Hala Xamarin üzerinde çalışan uygulamalar güvenlik ve uyumluluk riskleri taşır. .NET MAUI 10 (LTS, Kasım 2028'e kadar desteklenen) belirlenmiş geçiş hedefidir.
- Proje yapısı: Platforma özgü projelerden MAUI tek proje modeline dönüştürme. Paylaşılan kodu köke, platform kodunu
Platforms/altına taşıma. - Namespace'ler:
Xamarin.FormsyerineMicrosoft.Maui.ControlsveXamarin.EssentialsyerineMicrosoft.Maui.Essentials(artık MAUI'ye yerleşik) kullanma. - Renderer'lardan Handler'lara: Özel renderer'lar handler olarak yeniden yazılmalıdır. Handler API'si daha basittir ancak eşleme mantığı farklıdır.
- Başlangıç:
App.xaml.csbaşlatmasını builder deseni ileMauiProgram.cs'e taşıma. - NuGet paketleri: Birçok Xamarin dönemi paketin MAUI karşılığı bulunmaktadır. Yükseltmeden önce uyumluluk doğrulanmalıdır.
- Dependency injection: MAUI,
Microsoft.Extensions.DependencyInjection'ı yerel olarak kullanır. Üçüncü parti DI container'ları veyaDependencyServiceçağrılarını değiştirme.
.NET Upgrade Assistant, adım 1-2'nin bazı kısımlarını otomatikleştirir, ancak handler'lar (adım 3) ve iş mantığı ayarlamaları manuel çalışma gerektirir.
2026 için En Önemli .NET MAUI Mülakat Soruları
Bu sorular, mevcut .NET 10 ekosistemine dayalı olarak 2026'da işe alım ekiplerinin ne sorduğunu yansıtmaktadır. Daha fazla C# ve .NET mülakat hazırlığı için tam .NET mülakat rehberine bakılabilir.
MAUI handler mimarisi Xamarin.Forms renderer'larından nasıl farklıdır?
Xamarin.Forms'taki renderer'lar, hem çapraz platform kontrolüne hem de yerel görünüme sıkı sıkıya bağlıydı ve çift yönlü bir bağımlılık oluşturuyordu. MAUI'deki handler'lar stateless mapper'lardır: özellik değişikliği bildirimlerini alır ve bunları bir mapper sözlüğü aracılığıyla yerel görünüme uygular. Bu ayrıştırma, handler'ları test etmeyi, genişletmeyi ve yeniden kullanmayı kolaylaştırır. PropertyMapper ve CommandMapper sözlükleri, OnElementPropertyChanged override desenini değiştirerek özelleştirmeyi switch ifadelerine gömülü olmak yerine açık hale getirir.
MAUI'ye özgü DI ömür tuzakları nelerdir?
MAUI, Singleton, Transient ve Scoped ömürleri destekler, ancak Scoped, ASP.NET Core'dakinden farklı davranır. HTTP isteği gibi doğal bir scope sınırı yoktur. MAUI'de kaydedilen Scoped bir servis, manuel olarak özel scope'lar oluşturulmadıkça Singleton gibi davranır. Yaygın hatalar: bir ViewModel'i sayfaya özgü durum tutarken Singleton olarak kaydetmek (gezinme sırasında eski veriler) veya bir veritabanı bağlantısını Transient olarak kaydetmek (bağlantı havuzu tükenmesi). Temel kural: ViewModel'ler Transient, servisler Singleton ve Scoped, scope yaşam döngüsü açıkça yönetilmedikçe kaçınılır.
DI sorularını yanıtlarken, MAUI'nin yaşam döngüsünün ASP.NET Core'un request-scoped modelinden nasıl farklı olduğunu göstermek gerekir. Mülakatçılar, uzun süreli çalışan mobil uygulamalara özgü bellek sızıntıları ve eski durum sorunlarının farkındalığını arar.
MAUI'de derlenmiş bağlama ile reflection tabanlı bağlama arasındaki fark nedir?
Reflection tabanlı bağlamalar, çalışma zamanında System.Reflection kullanarak özellik yollarını çözer, bu yavaştır ve yazım hatalarında çalışma zamanı hataları üretir. x:DataType ile etkinleştirilen derlenmiş bağlamalar, bağlama yollarını derleme zamanında çözer. Derleyici, reflection'ı tamamen atlayarak doğrudan özellik erişim kodu üretir. Bu, başlatma süresini iyileştirir, bellek tahsislerini azaltır ve bağlama hatalarını derleme sırasında yakalar. .NET 10'da, yeni XAML source generator bunu çalışma zamanında ayrıştırmak yerine derleme zamanında XAML derleyerek daha da optimize eder.
MAUI uygulaması ile ASP.NET Core backend arasında kod paylaşımı için hangi stratejiler mevcuttur?
Önerilen yaklaşım, DTO'lar, doğrulama mantığı ve iş kuralları içeren paylaşımlı bir sınıf kütüphanesi kullanır. Hem MAUI uygulaması hem de ASP.NET Core backend bu kütüphaneyi referans alır. .NET 10, MAUI için .NET Aspire entegrasyonu ile bu deseni güçlendirir ve mobil ile backend projeleri arasında servis keşfi ve telemetri sağlar. System.Text.Json source generator'ları kullanan paylaşımlı sözleşmeler serileştirme tutarlılığını sağlar. Anahtar kısıtlama: paylaşımlı kütüphanenin taşınabilir kalması için net10.0'ı (platforma özgü TFM'ler değil) hedeflemesi gerekir.
HybridWebView, MAUI'deki BlazorWebView'dan nasıl farklıdır?
BlazorWebView, MAUI uygulaması içinde tam bir Blazor uygulaması barındırır. Razor bileşenleri gömülü bir WebView'a render edilir, ancak .NET çalışma zamanı yerel olarak çalışır (WebAssembly aracılığıyla değil). HybridWebView daha hafiftir: statik HTML/CSS/JS içeriği yükler ve Blazor framework yükü olmadan C#-JavaScript arası iletişim sağlar. Seçim kullanım durumuna bağlıdır. BlazorWebView, mevcut Blazor bileşenlerine sahip ve kod yeniden kullanımı isteyen ekiplere uygundur. HybridWebView, mevcut web içeriğinin (dashboard'lar, haritalar, editörler) tam bir framework olmadan yerel entegrasyona ihtiyaç duyduğu senaryolara uygundur.
SharpSkill'de daha fazla .NET mülakat sorusu ile bu kavramları interaktif alıştırmalarla pekiştirin.
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
Kaynaklar
- What's new in .NET MAUI for .NET 10 — tüm .NET 10 MAUI özelliklerini kapsayan resmi dokümantasyon
- .NET MAUI GitHub Releases — 10.0.x sürümleri için servis notları
- Edge-to-Edge Is Now Mandatory in Android 16 — Android 16 gereksinimleri için geçiş rehberi
- MAUI GitHub Discussion #34171 — .NET MAUI 10 kararlılığı hakkında topluluk geri bildirimi
.NET MAUI 10 Geliştiricilerinin Hatırlaması Gerekenler
- .NET MAUI 10, kararlılık ve performansa odaklanan bir LTS sürümüdür (Kasım 2028 desteği) ve üretim çapraz platform uygulamaları için güvenilir bir seçimdir
- Android 16, edge-to-edge'i zorunlu kılar: .NET 9 davranışını geri yüklemek için App.xaml'e global stil olarak
SafeAreaEdges="Container"eklenmelidir - XAML source generator (
MauiXamlInflator=SourceGen), XAML'i derleme zamanında derleyerek başlatma performansını artırır ve hataları daha erken yakalar - ListView, TableView ve MessagingCenter kullanımdan kaldırıldı: CollectionView ve WeakReferenceMessenger'a geçiş yapılmalıdır
- Handler mimarisi, Xamarin renderer'larını stateless mapper'larla değiştirerek
PropertyMapperveCommandMapperaracılığıyla test edilebilirliği artırır - CommunityToolkit.Mvvm source generator'ları MVVM boilerplate kodunun çoğunu kaldırır:
[ObservableProperty]ve[RelayCommand]attribute'ları manuel implementasyonları değiştirir - .NET 10'daki HybridWebView, yerel-web entegrasyonu için fire-and-forget JavaScript çağrıları, başlatma olayları ve istek yakalama ekler
- Mülakat hazırlığı handler vs. renderer mimarisi, uzun süreli çalışan uygulamalardaki DI ömür tuzakları, derlenmiş bağlamalar ve HybridWebView vs. BlazorWebView ödünleşimlerine odaklanmalıdır
.NET kodundaki hatayı bulabilir misin?
Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Yazan:
Anthony Fillion-MailletSharpSkill kurucusu
10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.
14 Eylül 2026 tarihinde güncellendi
Etiketler
Paylaş
İlgili makaleler

ASP.NET Core'da DbContext Yaşam Süresi: Async İşlemlerde Performans ve Thread Güvenliği
ASP.NET Core'da DbContext yaşam süresi yönetiminde ustalaşın. Scoped vs transient kullanımını, async işlemlerde thread güvenliğini ve DbContext pooling ile performans optimizasyonunu öğrenin.

ASP.NET Core 2026'da SignalR: Gerçek Zamanlı İletişim, Hub'lar ve Mülakat Soruları
ASP.NET Core'da SignalR için kapsamlı rehber. Gerçek zamanlı iletişim, hub yapılandırması, grup yönetimi ve mülakat hazırlığı konularını öğrenin.

.NET 9 Blazor: 2026'da Blazor United ile Full-Stack Geliştirme
.NET 9 Blazor United, statik SSR, Server ve WebAssembly render modlarını tek bir full-stack framework'te birleştirir. Render modları, streaming rendering, dependency injection ve production patterns içeren pratik rehber.