Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
UWP n’est plus en cours de développement actif. WinUI 3 et le SDK d'application Windows sont ses successeurs, et les outils IA peuvent automatiser la majeure partie de la migration. Le principal défi est que les modèles IA ont été formés sur des années d’échantillons UWP. Par conséquent, sans conseils, ils reproduisent les modèles que vous essayez de quitter. Cette page fournit à votre agent le contexte dont il a besoin pour bien faire les choses.
Installer le plug-in de l’agent WinUI
La winui-uwp-migration compétence gère automatiquement les substitutions courantes :
gh copilot plugin install winui@awesome-copilot
Pour plus d’informations, consultez le plug-in de l’agent WinUI .
Table de substitution d’API
Les tableaux suivants résument les substitutions d’API les plus courantes. Pour obtenir le mappage complet et détaillé — y compris les membres, les propriétés et les API moins courantes — consultez Mappage des API et bibliothèques UWP vers le SDK d'application Windows.
Important
x:Bind est en mode OneTime par défaut. Contrairement {Binding} à (ce qui est défini par défaut OneWay), x:Bind n’évalue qu’une seule fois, sauf si vous spécifiez Mode=OneWay ou Mode=TwoWay. Pendant la migration, auditez toutes les expressions x:Bind qui sont liées à des propriétés qui changent à l’exécution — l’absence de Mode=OneWay provoque des bogues du type « l’interface utilisateur ne se met pas à jour », invisibles à la compilation.
Espaces de noms
| 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 |
Thread
| UWP | WinUI 3 |
|---|---|
CoreDispatcher |
DispatcherQueue |
Dispatcher.RunAsync(...) |
DispatcherQueue.TryEnqueue(...) |
CoreApplication.MainView.CoreWindow.Dispatcher |
this.DispatcherQueue (à partir d’un Window ou Page) |
Windowing
| UWP | WinUI 3 |
|---|---|
ApplicationView |
AppWindow |
ApplicationView.GetForCurrentView() |
AppWindow.GetFromWindowId(...) |
ApplicationViewTitleBar |
AppWindowTitleBar |
CoreWindow |
Microsoft.UI.Xaml.Window |
SystemNavigationManager |
Bouton Retour via AppWindowTitleBar |
Boîtes de dialogue et sélecteurs
| UWP | WinUI 3 |
|---|---|
MessageDialog |
ContentDialog (défini XamlRoot) |
FileOpenPicker |
FileOpenPicker + InitializeWithWindow |
FileSavePicker |
FileSavePicker + InitializeWithWindow |
FolderPicker |
FolderPicker + InitializeWithWindow |
Important
Les sélecteurs nécessitent InitializeWithWindow avant l’appel PickSingleFileAsync (ou similaire) :
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd);
ContentDialog nécessite XamlRoot (pas InitializeWithWindow) :
var dialog = new ContentDialog { XamlRoot = this.Content.XamlRoot, ... };
await dialog.ShowAsync();
Notifications
| UWP | WinUI 3 |
|---|---|
Windows.UI.Notifications.ToastNotificationManager |
Microsoft.Windows.AppNotifications.AppNotificationManager |
Windows.UI.Notifications.BadgeUpdateManager |
Microsoft.Windows.BadgeNotifications.BadgeNotificationManager |
Windows.UI.Notifications.TileUpdateManager |
Les vignettes sont déconseillées : utiliser des notifications ou des widgets |
Mise en réseau et HTTP
| UWP | WinUI 3 (recommandé) |
|---|---|
Windows.Web.Http.HttpClient |
System.Net.Http.HttpClient (portable, aucune dépendance WinRT) |
Windows.Web.Syndication.SyndicationClient |
System.ServiceModel.Syndication.SyndicationFeed + HttpClient |
Windows.Web.AtomPub.AtomPubClient |
System.ServiceModel.Syndication ou HTTP direct |
Note
Les API HTTP WinRT (Windows.Web.Http) fonctionnent toujours dans les applications WinUI 3 empaquetées, mais les .NET équivalents sont recommandés pour la portabilité, le débogage plus simple et la prise en charge de l’écosystème plus large (middleware, DI, mocking).
Navigation
| UWP | WinUI 3 |
|---|---|
Frame.Navigate(typeof(MyPage)) |
Frame.Navigate(typeof(MyPage)) — inchangé |
SystemNavigationManager.BackRequested |
Gérer via NavigationView ou AppWindow |
Windows.UI.Core.Preview.SystemNavigationManagerPreview |
événement AppWindow.Closing |
Note
Navigation hamburger personnalisée (SplitView + NavMenuListView) : de nombreux exemples UWP implémentaient la navigation à l’aide d’un fichier AppShell.xaml personnalisé avec SplitView et un contrôle NavMenuListView développé manuellement (plus de 500 lignes environ). Dans WinUI 3, remplacez ce modèle entier par NavigationView, qui fournit la même expérience utilisateur avec l’accessibilité intégrée, le comportement réactif et la prise en charge des boutons précédents. Il s’agit généralement d’une réduction de code de 80 %.
Modèles MVVM
| UWP (implémentations personnalisées courantes) | WinUI 3 (recommandé) |
|---|---|
Personnalisé BindableBase / ObservableObject |
CommunityToolkit.Mvvm.ComponentModel.ObservableObject |
Personnalisé DelegateCommand / RelayCommand |
CommunityToolkit.Mvvm.Input.RelayCommand |
Manuelle SetProperty + OnPropertyChanged |
[ObservableProperty] générateur de code source |
INavigationService personnalisé |
Intégré Frame.Navigate + NavigationView |
Tip
Le package NuGet CommunityToolkit.Mvvm est la base MVVM recommandée pour les applications WinUI 3. Il remplace les classes de base codées à la main par des équivalents testés et générés automatiquement à partir du code source, éliminant ainsi des centaines de lignes de code répétitif.
dotnet add package CommunityToolkit.Mvvm
Cycle de vie de l’application
| UWP | WinUI 3 |
|---|---|
Application.Current.Suspending |
Microsoft.Windows.AppLifecycle (nécessite des modifications architecturales - voir remarque) |
Application.Current.Resuming |
AppInstance.GetCurrent().Activated (voir remarque) |
BackgroundTaskBuilder |
Tâches en arrière-plan du SDK d'application Windows |
Note
La migration du cycle de vie des applications WinUI 3 n’est pas un échange simple de nom d’API. Le SDK d'application Windows utilise un modèle d’activation et de suspension différent. Traitez le code de cycle de vie comme nécessitant une réécriture dédiée plutôt que la substitution automatisée. Consultez la documentation de cycle de vie SDK d'application Windows pour le modèle complet.
Paramètres et stockage
| UWP | WinUI 3 (empaqueté) | WinUI 3 (non empaqueté) |
|---|---|---|
ApplicationData.Current.LocalSettings |
Inchangé | ❌ Lève une exception — aucune identité de package |
ApplicationData.Current.LocalFolder |
Inchangé | ❌ Lève une exception — aucune identité de package |
Windows.Storage.KnownFolders |
Inchangé | ❌ Lève une exception — aucune identité de package |
Warning
Les applications non empaquetées ne peuvent pas utiliser ApplicationData.Current : cela génère une erreur à l’exécution, car il n’existe pas d’identité de package. Utilisez les API de fichier .NET standard à la place :
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
Si votre application UWP utilisait DataContractSerializer avec [DataMember]/[IgnoreDataMember], envisagez de migrer vers System.Text.Json (plus rapide, plus léger, avec prise en charge de la génération de code source). Le mappage d’attributs est :
-
[DataMember][JsonPropertyName("name")]→ (ou utilisez simplement des noms de propriétés directement) -
[IgnoreDataMember]→[JsonIgnore] -
[DataContract]→ Aucun équivalent nécessaire (System.Text.Json sérialise les propriétés publiques par défaut)
API qui ne changent pas
Windows.Devices.*, Windows.Media.*, Windows.UI.ViewManagement.UISettings, Windows.UI.Color et la plupart des API WinRT en dehors de l’espace de noms XAML sont inchangées.
Contrôles sans équivalent direct
Certains contrôles UWP n’existent pas dans WinUI 3. Choisissez un remplacement en fonction de votre scénario :
| Contrôle UWP | Remplacement de WinUI 3 | Remarques |
|---|---|---|
Pivot |
TabView, NavigationView (mode supérieur) ou RadioButtons + visibilité |
Pour 2 à 3 onglets fixes, RadioButtons avec changement de visibilité est la solution la plus simple. Pour les onglets dynamiques/fermables, utilisez TabView. |
RadialController |
Interopérabilité WinRT avec handle de fenêtre |
RadialController.CreateForCurrentView() n’a pas d’équivalent direct. utiliser RadialControllerInterop avec GetForWindow(hwnd) ; |
SystemNavigationManager |
Bouton Retour personnalisé ou NavigationView.IsBackEnabled |
SystemNavigationManager.GetForCurrentView() n’existe pas. Ajoutez votre propre bouton de retour ou utilisez le bouton de retour intégré de NavigationView. |
Encre, Win2D et impression
Ces sous-systèmes nécessitent des étapes de migration spécifiques au-delà des modifications apportées à l’espace de noms.
Windows Ink
WinUI inclut InkCanvas, InkToolbaret InkPresenter en tant qu’API expérimentales dans les versions expérimentales du SDK d'application Windows. Les versions stables ne les incluent pas. Pour la configuration, la personnalisation de la barre d’outils et les limitations connues, consultez Contrôles d’encrage pour les applications WinUI.
Dans les versions expérimentales, les contrôles et les types qui traitent l’entrée manuscrite se trouvent dans Microsoft.UI.Xaml.Controls. Les traits et les attributs de dessin restent dans Windows.UI.Input.Inking:
| UWP | WinUI 3 (versions expérimentales) |
|---|---|
Windows.UI.Xaml.Controls.InkCanvas, InkToolbaret les autres InkToolbar* types |
Microsoft.UI.Xaml.Controls, mêmes noms de type. Certains membres diffèrent. |
Windows.UI.Input.Inking.InkPresenter, InkStrokeContainer, InkStrokeInput, InkUnprocessedInput, InkSynchronizer, InkInputConfiguration, InkInputProcessingConfiguration, InkInputProcessingMode, InkInputRightDragAction, InkHighContrastAdjustment, InkStrokesCollectedEventArgs, InkStrokesErasedEventArgs |
Microsoft.UI.Xaml.Controls, mêmes noms de type. Certains membres diffèrent. |
Windows.UI.Input.Inking.InkStroke, InkDrawingAttributes, InkStrokeBuilder, InkPoint, InkPersistenceFormat, PenTipShape |
Aucun changement |
Windows.UI.Core.CoreInputDeviceTypes |
Aucun changement |
Chaque type UWP dans les deux premières lignes a un équivalent portant le même nom, mais SDK d'application Windows 2.5.4-experimental n'inclut pas tous leurs membres :
-
InkStrokeContainern’a aucun constructeur public etInkPresenter.StrokeContainerest en lecture seule. Pour basculer entre des ensembles de traits, enregistrez chaque ensemble avecSaveAsyncet restaurez-le avecLoadAsync, ce qui remplace les traits actuels. -
SaveAsyncetLoadAsyncretournentIAsyncAction, de sorte qu’ils ne signalent pas la progression etSaveAsyncne retourne pas le nombre d’octets qu’il a écrits. -
InkStrokeContainer.GetRecognitionResults,InkStrokeContainer.UpdateRecognitionResultsetInkInputConfiguration.IsPenHapticFeedbackEnabledne sont pas disponibles. -
InkToolbarRulerButton.Ruleret l’événementInkToolbar.IsRulerButtonCheckedChangedne sont pas disponibles. UWP a rendu obsolèteInkToolbarRulerButtonen faveur deInkToolbarStencilButton, utilisez donc le bouton gabarit et l’événementInkToolbar.IsStencilButtonCheckedChangedà la place.
SDK d'application Windows 2.4.1-experimental a ajouté des API de gomme, telles que InkToolbarEraserKind et InkToolbarEraserButton.SelectedEraser, que la version 2.5.4-experimental a supprimées. Ils n’ont jamais fait partie de UWP, donc ne les ajoutez pas au code migré. Pour obtenir la liste complète, consultez Modifications de la version expérimentale 2.4.1.
Étant donné que les types tels que InkPresenter et InkStrokeContainer existent dans les deux espaces de noms, l’importation des deux Microsoft.UI.Xaml.Controls et Windows.UI.Input.Inking provoque l’erreur CS0104 lorsque vous utilisez ces noms. Importez Microsoft.UI.Xaml.Controlset ajoutez des directives d’alias pour les Windows.UI.Input.Inking types que vous utilisez :
using Microsoft.UI.Xaml.Controls;
using InkDrawingAttributes = Windows.UI.Input.Inking.InkDrawingAttributes;
using InkStroke = Windows.UI.Input.Inking.InkStroke;
InkStrokeContainer.SaveAsync écrit dans un IOutputStream, et LoadAsync lit à partir d’un IInputStream. Pour utiliser des flux de fichiers System.IO, convertissez-les avec AsOutputStream et AsInputStream. Le fichier nécessite using System; pour attendre ces méthodes Windows Runtime, ainsi que using System.IO; et 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);
}
Vous pouvez continuer à connecter la barre d’outils au canevas avec InkToolbar.TargetInkCanvas, ou définir TargetInkPresenter pour la connecter directement à un InkPresenter. Pour ajouter vos propres outils à la barre d’outils, utilisez InkToolbarCustomToolButton et InkToolbarCustomToggleButton, comme indiqué dans Personnaliser la barre d’outils d’entrée manuscrite. Avant de migrer, passez en revue les limitations connues, telles que les problèmes signalés avec la règle et les pochoirs de rapporteur.
Si votre application doit utiliser une version stable, il n’existe aucun contrôle d’entrée manuscrite intégré vers lequel migrer. Affichez des traits avec Win2D et gérez vous-même l’entrée de pointeur, ou utilisez une bibliothèque d’entrée manuscrite tierce. Pour remplacer InkToolbar, utilisez un CommandBar avec des éléments AppBarToggleButton.
Win2D
Le nom du package Win2D a changé, mais la surface de l’API est identique :
| UWP | WinUI 3 |
|---|---|
Win2D.uwp (NuGet) |
Microsoft.Graphics.Win2D (NuGet) |
Toutes les Microsoft.Graphics.Canvas.* API (CanvasDevice, , CanvasBitmapCanvasRenderTarget, DrawInk) fonctionnent de la même façon. Seule la référence du package NuGet doit être mise à jour.
Impression
L’impression UWP utilise PrintManager.GetForCurrentView(). WinUI 3 nécessite l’interopérabilité du handle de fenêtre :
// 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);
Les PrintDocument API de rendu (Paginate, , GetPreviewPageAddPages) sont inchangées.
Important
Si vous omettez le handle de fenêtre, PrintManagerInterop.GetForWindow lève une COMException. Il s’agit du même modèle d’interopérabilité que FileOpenPicker : toute API utilisée GetForCurrentView() dans UWP a besoin d’un handle de fenêtre dans WinUI 3.
Requête de démarrage
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.
modifications apportées au fichier Project
Remplacez le framework cible UWP :
<!-- 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>
Ajoutez le package SDK d'application Windows :
dotnet add package Microsoft.WindowsAppSDK
Contenu connexe
- guide de migration SDK d'application Windows : procédure pas à pas complète de la migration manuelle
- Mappage des API et bibliothèques UWP à l’SDK d'application Windows : table complète de mappage d’API
- Ce qui est pris en charge lors de la migration d’UWP vers WinUI – état de prise en charge des fonctionnalités
- Migrer depuis WPF
Windows developer