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

WinUI bevatInkCanvas, InkToolbaren InkPresenter als experimentele API's in experimentele releases van de Windows App SDK. Stabiele releases bevatten ze niet. Zie Handschriftbesturingselementen voor WinUI-apps voor installatie, aanpassing van werkbalken en bekende beperkingen.

In experimentele releases bevinden de besturingselementen en de typen die inktinvoer verwerken zich in Microsoft.UI.Xaml.Controls. Pennenstreken en tekenattributen blijven in Windows.UI.Input.Inking:

UWP WinUI 3 (experimentele releases)
Windows.UI.Xaml.Controls.InkCanvas, InkToolbar, en de andere InkToolbar* typen Microsoft.UI.Xaml.Controls, dezelfde typenamen. Sommige leden verschillen.
Windows.UI.Input.Inking.InkPresenter, InkInputProcessingMode, InkStrokesCollectedEventArgs, InkHighContrastAdjustment, InkInputRightDragAction, InkInputProcessingConfiguration, InkInputConfiguration, InkSynchronizer, InkUnprocessedInput, InkStrokeInput, InkStrokeContainer, InkStrokesErasedEventArgs Microsoft.UI.Xaml.Controls, dezelfde typenamen. Sommige leden wijken af.
Windows.UI.Input.Inking.InkStroke, InkDrawingAttributes, InkPoint, InkStrokeBuilder, InkPersistenceFormat, PenTipShape Geen wijziging
Windows.UI.Core.CoreInputDeviceTypes Geen wijziging

Elk UWP-type in de eerste twee rijen heeft een tegenhanger met dezelfde naam, maar Windows App SDK 2.5.4-experimenteel bevat niet al hun leden:

  • InkStrokeContainer heeft geen openbare constructor en InkPresenter.StrokeContainer is alleen-lezen. Als u wilt schakelen tussen reeksen pennenstreken, slaat u elke set op met SaveAsync en herstelt u deze met LoadAsync, waardoor de huidige pennenstreken worden vervangen.
  • SaveAsync en LoadAsync retourneert IAsyncAction, zodat ze geen voortgang rapporteren en SaveAsync het aantal bytes dat het heeft geschreven niet retourneert.
  • InkStrokeContainer.GetRecognitionResults, InkStrokeContainer.UpdateRecognitionResultsen InkInputConfiguration.IsPenHapticFeedbackEnabled zijn niet beschikbaar.
  • InkToolbarRulerButton.Ruler en de InkToolbar.IsRulerButtonCheckedChanged gebeurtenis zijn niet beschikbaar. UWP heeft InkToolbarRulerButton verouderd verklaard ten gunste van InkToolbarStencilButton, dus gebruik in plaats daarvan de stencilknop en de InkToolbar.IsStencilButtonCheckedChanged-gebeurtenis.

Windows App SDK 2.4.1-experimental voegde gum-API's toe, zoals InkToolbarEraserKind en InkToolbarEraserButton.SelectedEraser, die 2.5.4-experimental verwijderde. Ze maakten nooit deel uit van UWP, dus voeg ze niet toe aan gemigreerde code. Zie Wijzigingen van 2.4.1-experimenteel voor de volledige lijst.

Omdat typen zoals InkPresenter en InkStrokeContainer in beide naamruimten bestaan, veroorzaakt het importeren van zowel Microsoft.UI.Xaml.Controls als Windows.UI.Input.Inking fout CS0104 wanneer u deze namen gebruikt. Importeer Microsoft.UI.Xaml.Controlsen voeg aliasrichtlijnen toe voor de Windows.UI.Input.Inking typen die u gebruikt:

using Microsoft.UI.Xaml.Controls;
using InkDrawingAttributes = Windows.UI.Input.Inking.InkDrawingAttributes;
using InkStroke = Windows.UI.Input.Inking.InkStroke;

InkStrokeContainer.SaveAsync schrijft naar een IOutputStream, en LoadAsync leest van een IInputStream. Als u System.IO bestandsstromen wilt gebruiken, converteert u ze met AsOutputStream en AsInputStream. Het bestand heeft using System; nodig om op deze Windows Runtime-methoden te wachten, samen met using System.IO; en using Windows.Storage.Streams;:

// Save ink strokes to a file.
using (FileStream fileStream = File.Create(filePath))
using (IOutputStream output = fileStream.AsOutputStream())
{
    await inkStrokeContainer.SaveAsync(output);
    await output.FlushAsync();
}

// Load ink strokes from a file.
using (FileStream fileStream = File.OpenRead(filePath))
using (IInputStream input = fileStream.AsInputStream())
{
    await inkStrokeContainer.LoadAsync(input);
}

U kunt de werkbalk met het canvas verbonden houden met InkToolbar.TargetInkCanvas, of TargetInkPresenter zo instellen dat deze rechtstreeks met een InkPresenter wordt verbonden. Als u uw eigen hulpmiddelen wilt toevoegen aan de werkbalk, gebruikt InkToolbarCustomToolButton u en InkToolbarCustomToggleButton, zoals wordt weergegeven in de werkbalk Inkt aanpassen. Bekijk voordat u migreert de bekende beperkingen, zoals gerapporteerde problemen met de liniaal en stencils voor de gradenboog.

Als uw app een stabiele release moet gebruiken, is er geen ingebouwd inktbesturingselement om naar te migreren. Render stroken met Win2D en verwerk pointerinvoer zelf, of gebruik een inktbibliotheek van derden. Om InkToolbar te vervangen, gebruikt u een CommandBar met AppBarToggleButton items.

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)
- InkCanvas, InkToolbar, InkPresenter, InkStrokeContainer, and the other ink input types → Microsoft.UI.Xaml.Controls (experimental Windows App SDK releases only; if the project uses a stable release, flag them instead)
- Ink members that Windows App SDK 2.5.4-experimental doesn't include (new InkStrokeContainer(), assignments to InkPresenter.StrokeContainer, GetRecognitionResults, UpdateRecognitionResults, IsPenHapticFeedbackEnabled, InkToolbarRulerButton.Ruler, IsRulerButtonCheckedChanged, and progress or byte counts from SaveAsync and LoadAsync) → flag them
- PrintManager.GetForCurrentView → PrintManagerInterop.GetForWindow(hwnd)
- Win2D.uwp NuGet → Microsoft.Graphics.Win2D NuGet
- InkStroke, InkDrawingAttributes, InkPoint, InkStrokeBuilder → no change (Windows.UI.Input.Inking; use using aliases to avoid CS0104)

Do not use any Windows.UI.Xaml.* namespaces in new code.
Do not use CoreDispatcher — use DispatcherQueue.
Do not add InkToolbarEraserKind, SelectedEraser, or other eraser APIs from Windows App SDK 2.4.1-experimental. Version 2.5.4-experimental removed them.
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