Een UWP-app migreren naar WinUI 3

UWP wordt niet langer actief ontwikkeld. WinUI 3 en de Windows App SDK zijn opvolgers, en AI-hulpprogramma's kunnen de meeste migratie automatiseren. De belangrijkste uitdaging is dat AI-modellen zijn getraind op jaren van UWP-voorbeelden, dus zonder richtlijnen reproduceren ze de patronen waarvan u weg wilt gaan. Deze pagina geeft uw agent de context die deze nodig heeft om het goed te doen.

De WinUI-agentinvoegtoepassing installeren

De winui-uwp-migration vaardigheid verwerkt de algemene vervangingen automatisch:

gh copilot plugin install winui@awesome-copilot

Zie de WinUI-agentinvoegtoepassing voor meer informatie.

API-substitutietabel

In de volgende tabellen worden de meest voorkomende API-vervangingen samengevat. Zie UWP-API's en bibliotheken toewijzen aan de Windows App SDK voor de volledige gedetailleerde toewijzing, inclusief leden, eigenschappen en minder algemene API's.

Important

x:Bind wordt standaard ingesteld op OneTime de modus. In tegenstelling tot {Binding} (die standaard op OneWay staat), wordt x:Bind slechts één keer geëvalueerd, tenzij u Mode=OneWay of Mode=TwoWay opgeeft. Controleer tijdens de migratie alle x:Bind-expressies die binden aan eigenschappen die tijdens runtime veranderen — ontbrekende Mode=OneWay veroorzaakt bugs waarbij de gebruikersinterface niet wordt bijgewerkt en die tijdens het compileren niet zichtbaar zijn.

Namespaces

UWP WinUI 3
Windows.UI.Xaml.* Microsoft.UI.Xaml.*
Windows.UI.Xaml.Controls.* Microsoft.UI.Xaml.Controls.*
Windows.UI.Xaml.Media.* Microsoft.UI.Xaml.Media.*
Windows.UI.Composition Microsoft.UI.Composition

Draadbewerking

UWP WinUI 3
CoreDispatcher DispatcherQueue
Dispatcher.RunAsync(...) DispatcherQueue.TryEnqueue(...)
CoreApplication.MainView.CoreWindow.Dispatcher this.DispatcherQueue (van een Window of Page)

Windowing

UWP WinUI 3
ApplicationView AppWindow
ApplicationView.GetForCurrentView() AppWindow.GetFromWindowId(...)
ApplicationViewTitleBar AppWindowTitleBar
CoreWindow Microsoft.UI.Xaml.Window
SystemNavigationManager Terugknop via AppWindowTitleBar

Dialoogvensters en selectievensters

UWP WinUI 3
MessageDialog ContentDialog (ingesteld op XamlRoot)
FileOpenPicker FileOpenPicker + InitializeWithWindow
FileSavePicker FileSavePicker + InitializeWithWindow
FolderPicker FolderPicker + InitializeWithWindow

Important

Pickers hebben InitializeWithWindow nodig voordat PickSingleFileAsync wordt aangeroepen (of iets vergelijkbaars):

var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd);

ContentDialog vereist XamlRoot (niet InitializeWithWindow):

var dialog = new ContentDialog { XamlRoot = this.Content.XamlRoot, ... };
await dialog.ShowAsync();

Meldingen

UWP WinUI 3
Windows.UI.Notifications.ToastNotificationManager Microsoft.Windows.AppNotifications.AppNotificationManager
Windows.UI.Notifications.BadgeUpdateManager Microsoft.Windows.BadgeNotifications.BadgeNotificationManager
Windows.UI.Notifications.TileUpdateManager Tegels zijn afgeschaft: meldingen of widgets gebruiken

Netwerken en HTTP

UWP WinUI 3 (aanbevolen)
Windows.Web.Http.HttpClient System.Net.Http.HttpClient (draagbaar, geen WinRT-afhankelijkheid)
Windows.Web.Syndication.SyndicationClient System.ServiceModel.Syndication.SyndicationFeed + HttpClient
Windows.Web.AtomPub.AtomPubClient System.ServiceModel.Syndication of rechtstreeks via HTTP

Note

De WinRT HTTP-API's (Windows.Web.Http) werken nog steeds in verpakte WinUI 3-apps, maar de .NET equivalenten worden aanbevolen voor draagbaarheid, eenvoudigere foutopsporing en bredere ondersteuning voor ecosystemen (middleware, DI, mocking).

UWP WinUI 3
Frame.Navigate(typeof(MyPage)) Frame.Navigate(typeof(MyPage)) — ongewijzigd
SystemNavigationManager.BackRequested Bedien via NavigationView of AppWindow
Windows.UI.Core.Preview.SystemNavigationManagerPreview AppWindow.Closing gebeurtenis

Note

Aangepaste hamburgernavigatie (SplitView + NavMenuListView): Veel UWP-voorbeelden hebben navigatie geïmplementeerd met behulp van een aangepast AppShell.xaml met SplitView en een handgerold besturingselement NavMenuListView (ongeveer 500+ lijnen). Vervang in WinUI 3 dit hele patroon door NavigationView, dat dezelfde UX biedt met ingebouwde toegankelijkheid, responsief gedrag en ondersteuning voor back-buttons. Dit is doorgaans 80% minder code.

MVVM-patronen

UWP (algemene aangepaste implementaties) WinUI 3 (aanbevolen)
Aangepaste BindableBase / ObservableObject CommunityToolkit.Mvvm.ComponentModel.ObservableObject
Aangepaste DelegateCommand / RelayCommand CommunityToolkit.Mvvm.Input.RelayCommand
Handmatig SetProperty + OnPropertyChanged [ObservableProperty] brongenerator
Gewoonte INavigationService Ingebouwde Frame.Navigate + NavigationView

Tip

Het NuGet-pakket CommunityToolkit.Mvvm is de aanbevolen MVVM-basis voor WinUI 3-apps. Het vervangt handmatig geschreven basisklassen door geteste, via broncode gegenereerde equivalenten, waardoor honderden regels standaardcode overbodig worden.

dotnet add package CommunityToolkit.Mvvm

App-levenscyclus

UWP WinUI 3
Application.Current.Suspending Microsoft.Windows.AppLifecycle (vereist architecturale wijzigingen — zie opmerking)
Application.Current.Resuming AppInstance.GetCurrent().Activated (zie opmerking)
BackgroundTaskBuilder Windows App SDK achtergrondtaken

Note

De levenscyclusmigratie van WinUI 3-apps is geen eenvoudige API-naamwisseling. De Windows App SDK maakt gebruik van een ander activerings- en veringsmodel. Behandel levenscycluscode alsof die een afzonderlijke herziening vereist, in plaats van automatische vervanging. Zie de documentatie Windows App SDK levenscyclus voor het volledige model.

Instellingen en opslag

UWP WinUI 3 (verpakt) WinUI 3 (uitgepakt)
ApplicationData.Current.LocalSettings Ongewijzigd ❌ Werpt - geen pakketidentiteit
ApplicationData.Current.LocalFolder Ongewijzigd ❌ Werpt - geen pakketidentiteit
Windows.Storage.KnownFolders Ongewijzigd ❌ Werpt - geen pakketidentiteit

Warning

Apps zonder pakket kunnen ApplicationData.Current niet gebruiken — dit veroorzaakt een runtimefout omdat er geen pakketidentiteit is. Gebruik in plaats daarvan standaard-API's voor .NET-bestanden:

var appData = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
    "YourAppName");
Directory.CreateDirectory(appData);
var json = JsonSerializer.Serialize(data);
await File.WriteAllTextAsync(Path.Combine(appData, "settings.json"), json);

Note

Als uw UWP-app gebruikmaakte van DataContractSerializer in combinatie met [DataMember]/[IgnoreDataMember], overweeg dan om te migreren naar System.Text.Json (sneller, kleiner, met ondersteuning voor brongeneratie). De kenmerktoewijzing is:

  • [DataMember][JsonPropertyName("name")] (of gebruik de eigenschapsnamen rechtstreeks)
  • [IgnoreDataMember][JsonIgnore]
  • [DataContract] → Geen equivalent nodig (System.Text.Json serialiseert standaard openbare eigenschappen)

API's die niet worden gewijzigd

Windows.Devices.*, Windows.Media.*, Windows.UI.ViewManagement.UISettings, Windows.UI.Color en de meeste WinRT-API's buiten de XAML-naamruimte zijn ongewijzigd.

Besturingselementen zonder een direct equivalent

Sommige UWP-besturingselementen bestaan niet in WinUI 3. Kies een vervanging op basis van uw scenario:

UWP-besturingselement WinUI 3 vervanging Opmerkingen
Pivot TabView, NavigationView (bovenste modus) of RadioButtons + zichtbaarheid Voor 2–3 vaste tabbladen is RadioButtons met het wisselen van de zichtbaarheid het eenvoudigst. Voor dynamische/sluitbare tabbladen gebruikt u TabView.
InkToolbar (aangepaste subklasse) CommandBar met AppBarToggleButton items De ingebouwde InkToolbar bestaat, maar patronen voor aangepaste subklassen laten zich niet goed vertalen. Aangepaste werkbalken opnieuw opbouwen met behulp van CommandBar.
RadialController WinRT-interop met venstergreep RadialController.CreateForCurrentView() heeft geen direct equivalent. Gebruik RadialControllerInterop met GetForWindow(hwnd).
SystemNavigationManager Aangepaste terugknop of NavigationView.IsBackEnabled SystemNavigationManager.GetForCurrentView() bestaat niet. Voeg uw eigen terugknop toe of gebruik de ingebouwde terugknop van NavigationView.

Inkt, Win2D en afdrukken

Voor deze subsystemen zijn specifieke migratiestappen vereist die verder gaan dan wijzigingen in de naamruimte.

Windows inkt

De InkCanvas- en InkPresenter-API’s verhuizen naar Microsoft.UI.Input.Inking, maar zijn verder identiek. De ene niet-voor de hand liggende verandering is CoreInputDeviceTypes:

UWP WinUI 3
Windows.UI.Input.Inking.* Microsoft.UI.Input.Inking.*
Windows.UI.Core.CoreInputDeviceTypes Microsoft.UI.Core.CoreInputDeviceTypes

InkStrokeContainer.SaveAsync() en LoadAsync() hebben nog steeds IRandomAccessStream nodig. Brug van System.IO stromen:

// Saving ink strokes to a file using System.IO
using var memoryStream = new MemoryStream();
using var ras = memoryStream.AsRandomAccessStream();
await inkStrokeContainer.SaveAsync(ras);
await File.WriteAllBytesAsync(filePath, memoryStream.ToArray());

// Loading ink strokes from a file
var bytes = await File.ReadAllBytesAsync(filePath);
using var ms = new MemoryStream(bytes);
using var ras = ms.AsRandomAccessStream();
await inkStrokeContainer.LoadAsync(ras);

Win2D

De win2D-pakketnaam is gewijzigd, maar de API-surface is identiek:

UWP WinUI 3
Win2D.uwp (NuGet) Microsoft.Graphics.Win2D (NuGet)

Alle Microsoft.Graphics.Canvas.* API's (CanvasDevice, CanvasBitmap, CanvasRenderTarget, DrawInk) werken op dezelfde manier. Alleen de Verwijzing naar het NuGet-pakket moet worden bijgewerkt.

Drukkerij

UWP-afdrukken maakt gebruik van PrintManager.GetForCurrentView(). WinUI 3 vereist interoperabiliteit met vensterhandgrepen:

// UWP
var printManager = PrintManager.GetForCurrentView();
printManager.PrintTaskRequested += OnPrintTaskRequested;
await PrintManager.ShowPrintUIAsync();

// WinUI 3 — must pass window handle
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
var printManager = PrintManagerInterop.GetForWindow(hwnd);
printManager.PrintTaskRequested += OnPrintTaskRequested;
await PrintManagerInterop.ShowPrintUIForWindowAsync(hwnd);

De PrintDocument rendering-API's (Paginate, GetPreviewPage, AddPages) zijn ongewijzigd.

Important

Als u de vensterhandle weglaat, genereert PrintManagerInterop.GetForWindow een COMException. Dit is hetzelfde interop-patroon als FileOpenPicker : elke API die in UWP wordt gebruikt GetForCurrentView() , heeft een venstergreep nodig in WinUI 3.

Startprompt

I'm migrating a UWP app to WinUI 3 using the Windows App SDK.

Apply these substitutions:
- Windows.UI.Xaml.* → Microsoft.UI.Xaml.*
- CoreDispatcher / Dispatcher.RunAsync → DispatcherQueue.TryEnqueue
- ApplicationView → AppWindow + AppWindowTitleBar
- CoreWindow → Microsoft.UI.Xaml.Window
- MessageDialog → ContentDialog (set XamlRoot, not InitializeWithWindow)
- FileOpenPicker / FileSavePicker / FolderPicker → add InitializeWithWindow
- Windows.UI.Notifications → Microsoft.Windows.AppNotifications
- SystemNavigationManager.BackRequested → NavigationView back handling
- Pivot → TabView, NavigationView (top mode), or RadioButtons (no direct equivalent)
- InkToolbar custom subclasses → rebuild as CommandBar with AppBarToggleButton
- PrintManager.GetForCurrentView → PrintManagerInterop.GetForWindow(hwnd)
- Win2D.uwp NuGet → Microsoft.Graphics.Win2D NuGet
- Windows.UI.Input.Inking.* → Microsoft.UI.Input.Inking.*

Do not use any Windows.UI.Xaml.* namespaces in new code.
Do not use CoreDispatcher — use DispatcherQueue.
x:Bind defaults to Mode=OneTime. Add Mode=OneWay for any binding that should update at runtime.
Flag any APIs without a direct WinUI 3 equivalent rather than guessing.

Wijzigingen in projectbestanden

Vervang het UWP-doelframework:

<!-- Before (UWP) -->
<TargetPlatformVersion>10.0.19041.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>

<!-- After (WinUI 3) -->
<TargetFramework>net10.0-windows10.0.19041.0</TargetFramework>
<WindowsSdkPackageVersion>10.0.19041.31</WindowsSdkPackageVersion>

Voeg het Windows App SDK-pakket toe:

dotnet add package Microsoft.WindowsAppSDK