Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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).
Navigation
| 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
Verwante inhoud
- Windows App SDK migratiehandleiding : volledige handleiding voor handmatige migratie
- UWP-API's en -bibliotheken toewijzen aan de Windows App SDK - uitgebreide API-toewijzingstabel
- Wat wordt ondersteund bij het migreren van UWP naar WinUI - status van functieondersteuning
- Migreren van WPF
Windows developer