2026'da .NET MAUI: Çapraz Platform Geliştirme Rehberi ve Mülakat Soruları

.NET MAUI 10 ile çapraz platform uygulama geliştirme rehberi. Handler mimarisi, MVVM pattern, HybridWebView ve sık sorulan mülakat soruları.

.NET MAUI cross-platform development tutorial 2026

.NET MAUI (Multi-platform App UI), .NET 10 ile birlikte tam anlamıyla üretime hazır bir çapraz platform framework haline geldi. Uzun Vadeli Destek (LTS) sürümü olarak Kasım 2028'e kadar desteklenen .NET MAUI 10, kalite ve performansa odaklanarak HybridWebView geliştirmeleri ve SafeAreaEdges gibi yeni API'ler sunuyor. Bu makale, sıfırdan bir çapraz platform uygulaması oluşturmayı, MAUI'yi çalıştıran mimariyi ve 2026'da işe alım süreçlerinde sorulan mülakat sorularını ele almaktadır.

.NET MAUI 10 LTS

.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ü haline getirir. 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, .NET Aspire servis varsayılanlarını içeren güncellenmiş bir proje şablonu sunar.

bash
# 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-android

Tek 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.

MauiProgram.cscsharp
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 — kullanılabilir olmalarına rağmen — MAUI'de HTTP istekleri gibi yerleşik bir scope kavramı bulunmadığından dikkat gerektirir.

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 şudur: 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.

CustomEntryHandler.cs — Customizing the Entry control on Androidcsharp
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ılmaktadır.

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.

MainViewModel.cscsharp
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:

xml
<!-- 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 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.

MainPage.xaml.cs — HybridWebView interactioncsharp
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        // Initialization event for platform-specific tweaks
        hybridWebView.WebViewInitialized += (sender, args) =>
        {
            // Access the native platform view after initialization
            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",  // JS function name
            HybridSampleContext.Default.String  // JSON serialization context
        );
        await DisplayAlert("Result", result, "OK");
    }

    // Fire-and-forget: no return type needed (.NET 10)
    private async void OnResetClicked(object sender, EventArgs e)
    {
        await hybridWebView.InvokeJavaScriptAsync("resetForm");
    }
}

Karşılık gelen JavaScript, çağrıları alır ve C#'a mesaj gönderebilir:

wwwroot/index.html (HybridWebView content)javascript
function getFormData() {
    return JSON.stringify({
        name: document.getElementById('name').value,
        email: document.getElementById('email').value
    });
}

function resetForm() {
    document.getElementById('name').value = '';
    document.getElementById('email').value = '';
}

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.

SafeAreaEdges: Her Cihazda Piksel Düzeyinde Düzenler

.NET MAUI 10, Layout, ContentView, ContentPage, Border ve ScrollView genelinde SafeAreaEdges özelliğini sunar. Yeni enum (None, SoftInput, Container, Default, All), eski iOS'a özgü Page.UseSafeArea yaklaşımını çapraz platform bir çözümle değiştirir.

xml
<!-- Granular safe area control per section -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             SafeAreaEdges="All">
    <Grid RowDefinitions="Auto,*,Auto">
        <!-- Header respects all safe areas -->
        <Border Grid.Row="0" SafeAreaEdges="Container">
            <Label Text="Header" />
        </Border>

        <!-- Content scrolls under safe areas -->
        <ScrollView Grid.Row="1" SafeAreaEdges="SoftInput">
            <VerticalStackLayout Padding="16">
                <Entry Placeholder="Type here..." />
            </VerticalStackLayout>
        </ScrollView>

        <!-- Footer avoids home indicator -->
        <Border Grid.Row="2" SafeAreaEdges="Container">
            <Label Text="Footer" />
        </Border>
    </Grid>
</ContentPage>

SoftInput, ekran klavyesi göründüğünde içeriği ayarlar. Container, çentiklerden, sensör yuvalarından ve ana göstergeden kaçınır. Bunlar kontrol başına birleştirilebilir.

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.

Xamarin Destek Sonu

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.

  1. 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.
  2. Namespace'lerXamarin.Forms yerine Microsoft.Maui.Controls ve Xamarin.Essentials yerine Microsoft.Maui.Essentials kullanma.
  3. Renderer'lardan Handler'lara — Özel renderer'lar handler olarak yeniden yazılmalıdır.
  4. BaşlangıçApp.xaml.cs başlatmasını builder deseni ile MauiProgram.cs'e taşıma.
  5. NuGet paketleri — Birçok Xamarin dönemi paketin MAUI karşılığı bulunmaktadır.
  6. Dependency injection — MAUI, Microsoft.Extensions.DependencyInjection'ı yerel olarak kullanır. Üçüncü parti DI container'ları veya DependencyService çağrılarını değiştirme.

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.

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 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. 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).

Mülakat İpucu

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.

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.

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.

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 tam bir framework olmadan yerel entegrasyona ihtiyaç duyduğu senaryolara uygundur.

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Sonuç

  • .NET MAUI 10, kararlılık ve performansa odaklanan bir LTS sürümüdür (Kasım 2028 desteği) — üretim çapraz platform uygulamaları için güvenilir bir seçimdir
  • Handler mimarisi, Xamarin renderer'larını stateless mapper'larla değiştirerek PropertyMapper ve CommandMapper aracılığıyla test edilebilirliği ve özelleştirmeyi artırır
  • CommunityToolkit.Mvvm kaynak üreteçleri 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
  • SafeAreaEdges, cihaz çentikleri, klavyeler ve sistem çubukları üzerinde ayrıntılı, çapraz platform kontrol sağlar
  • Xamarin.Forms geçişi handler yeniden yazımları ve başlangıç yeniden yapılandırması gerektirir
  • Mülakat hazırlığı handler vs. renderer mimarisi, DI ömür tuzakları, derlenmiş bağlamalar ve HybridWebView vs. BlazorWebView ödünleşimlerine odaklanmalıdır

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Etiketler

#dotnet
#maui
#cross-platform
#xamarin
#mobile

Paylaş

İlgili makaleler