winui3-migration-guide

UWP-to-WinUI 3 migration reference. Maps legacy UWP APIs to correct Windows App SDK equivalents with before/after code snippets. Covers namespace changes, threading (CoreDispatcher to DispatcherQueue), windowing (CoreWindow to AppWindow), dialogs, pickers, sharing, printing, background tasks, and th

By github · 5,741 installs

npx skills add github/awesome-copilot --skill winui3-migration-guide

Source repository · Upstream listing

WinUI 3 Migration Guide Use this skill when migrating UWP apps to WinUI 3 / Windows App SDK, or when verifying that generated code uses correct WinUI 3 APIs instead of legacy UWP patterns. Namespace Changes All Windows.UI.Xaml. namespaces move to Microsoft.UI.Xaml. : UWP Namespace WinUI 3 Namespace Windows.UI.Xaml Microsoft.UI.Xaml Windows.UI.Xaml.Controls Microsoft.UI.Xaml.Controls Windows.UI.Xaml.Media Microsoft.UI.Xaml.Media Windows.UI.Xaml.Input Microsoft.UI.Xaml.Input Windows.UI.Xaml.Data Microsoft.UI.Xaml.Data Windows.UI.Xaml.Navigation Microsoft.UI.Xaml.Navigation Windows.UI.Xaml.Shapes Microsoft.UI.Xaml.Shapes Windows.UI.Composition Microsoft.UI.Composition Windows.UI.Input Microsoft.UI.Input Windows.UI.Colors Microsoft.UI.Colors Windows.UI.Text Microsoft.UI.Text Windows.UI.Core Microsoft.UI.Dispatching (for dispatcher) Top 3 Most Common Copilot Mistakes 1. ContentDialog Without XamlRoot 2. MessageDialog Instead of ContentDialog 3. CoreDispatcher Instead of DispatcherQueue Windowing Migration Window Reference Window Management UWP API WinUI 3 API ApplicationView.TryResizeView() AppWindow.Resize() AppWindow.TryCreateAsync() AppWindow.Create() AppWindow.TryShowAsync() AppWindow.Show() AppWindow.TryConsolidateAsync() AppWindow.Destroy() AppWindow.RequestMoveXxx() AppWindow.Move() AppWindow.GetPlacement() AppWindow.Position property AppWindow.RequestPresentation() AppWindow.SetPresenter() Title Bar UWP API WinUI 3 API CoreApplicationViewTitleBar AppWindowTitleBar CoreApplicationView.TitleBar.ExtendViewIntoTitleBar AppWindow.TitleBar.ExtendsContentIntoTitleBar Dialogs and Pickers Migration File/Folder Pickers Threading Migration UWP Pattern WinUI 3 Equivalent CoreDispatcher.RunAsync(priority, callback) DispatcherQueue.TryEnqueue(priority, callback) Dispatcher.HasThreadAccess DispatcherQueue.HasThreadAccess CoreDispatcher.ProcessEvents() No equivalent — restructure async code CoreWindow.GetForCurrentThread() Not available — use DispatcherQueue.GetForCurrentThread() Key difference : UWP uses ASTA (Application STA) with built in reentrancy blocking. WinUI 3 uses standard STA without this protection. Watch for reentrancy issues when async code pumps messages. Background Tasks Migration App Settings Migration Scenario Packaged App Unpackaged App Simple settings ApplicationData.Current.LocalSettings JSON file in LocalApplicationData Local file storage ApplicationData.Current.LocalFolder Environment.GetFolderPath(SpecialFolder.LocalApplicationData) GetForCurrentView() Replacements All GetForCurrentView() patterns are unavailable in WinUI 3 desktop apps: UWP API WinUI 3 Replacement UIViewSettings.GetForCurrentView() Use AppWindow properties ApplicationView.GetForCurrentView() AppWindow.GetFromWindowId(windowId) DisplayInformation.GetForCurrentView() Win32 GetDpiForWindow() or XamlRoot.RasterizationScale CoreApplication.GetCurrentView() Not available — track windows manually SystemNavigationManager.GetForCurrentView() Handle back navigation in NavigationView directly Testing Migration UWP unit test projects do not work with WinUI 3. You must migrate to the WinUI 3 test project templates. UWP WinUI 3 Unit Test App (Universal Windows) Unit Test App (WinUI in Desktop) Standard MSTest project with UWP types Must use WinUI test app for Xaml runtime [TestMethod] for all tests [TestMethod] for logic, [UITestMethod] for XAML/UI tests Class Library (Universal Windows) Class Library (WinUI in Desktop) Key: The [UITestMethod] attribute tells the test runner to execute the test on the XAML UI thread, which is required for instantiating any Microsoft.UI.Xaml type. Migration Checklist 1. [ ] Replace all Windows.UI.Xaml. using directives with Microsoft.UI.Xaml. 2. [ ] Replace Windows.UI.Colors with Microsoft.UI.Colors 3. [ ] Replace CoreDispatcher.RunAsync with DispatcherQueue.TryEnqueue 4. [ ] Replace Window.Current with App.MainWindow static property 5. [ ] Add XamlRoot to all ContentDialog instances 6. [ ] Initialize all pickers with InitializeWithWindow.Initialize(picker, hwnd) 7. [ ] Replace MessageDialog with ContentDialog 8. [ ] Replace ApplicationView / CoreWindow with AppWindow 9. [ ] Replace CoreApplicationViewTitleBar with AppWindowTitleBar 10. [ ] Replace all GetForCurrentView() calls with AppWindow equivalents 11. [ ] Update interop for Share and Print managers 12. [ ] Replace IBackgroundTask with AppLifecycle activation 13. [ ] Update project file: TFM to net10.0 windows10.0.22621.0 , add <UseWinUI true</UseWinUI 14. [ ] Migrate unit tests to Unit Test App (WinUI in Desktop) project; use [UITestMethod] for XAML tests 15. [ ] Test both packaged and unpackaged configurations