Source profileQuality 76/100

github/awesome-copilot/skills/winui3-migration-guide/SKILL.md

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 the most common Copilot code generation mistakes.

Source repository stars
37,126
Declared platforms
0
Static risk flags
1
Last source update
2026-07-28
Source checked
2026-07-28

Decision brief

What it does—and where it fits

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.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/github/awesome-copilot --skill "skills/winui3-migration-guide"
    Safe inspection promptEditorial

    Inspect the Agent Skill "winui3-migration-guide" from https://github.com/github/awesome-copilot/blob/9933dcad5be5caeb288cebcd370eeeb2fc2f1685/skills/winui3-migration-guide/SKILL.md at commit 9933dcad5be5caeb288cebcd370eeeb2fc2f1685. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Namespace Changes

      All Windows.UI.Xaml. namespaces move to Microsoft.UI.Xaml.:

      All Windows.UI.Xaml. namespaces move to Microsoft.UI.Xaml.:
    2. 02

      Top 3 Most Common Copilot Mistakes

      Review the “Top 3 Most Common Copilot Mistakes” section in the pinned source before continuing.

      Review and apply the “Top 3 Most Common Copilot Mistakes” source section.
    3. 03

      1. ContentDialog Without XamlRoot

      Review the “1. ContentDialog Without XamlRoot” section in the pinned source before continuing.

      Review and apply the “1. ContentDialog Without XamlRoot” source section.
    4. 04

      2. MessageDialog Instead of ContentDialog

      Review the “2. MessageDialog Instead of ContentDialog” section in the pinned source before continuing.

      Review and apply the “2. MessageDialog Instead of ContentDialog” source section.
    5. 05

      3. CoreDispatcher Instead of DispatcherQueue

      Review the “3. CoreDispatcher Instead of DispatcherQueue” section in the pinned source before continuing.

      Review and apply the “3. CoreDispatcher Instead of DispatcherQueue” source section.

    Permission review

    Static risk signals and limitations

    Writes files

    medium · line 270

    The documentation asks the agent to create, modify, or delete local files.

    [ ] Update project file: TFM to `net10.0-windows10.0.22621.0`, add `<UseWinUI>true</UseWinUI>`

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score76/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars37,126SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    github/awesome-copilot
    Skill path
    skills/winui3-migration-guide/SKILL.md
    Commit
    9933dcad5be5caeb288cebcd370eeeb2fc2f1685
    License
    MIT
    Collected
    2026-07-28
    Default branch
    main
    View the original SKILL.md

    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 NamespaceWinUI 3 Namespace
    Windows.UI.XamlMicrosoft.UI.Xaml
    Windows.UI.Xaml.ControlsMicrosoft.UI.Xaml.Controls
    Windows.UI.Xaml.MediaMicrosoft.UI.Xaml.Media
    Windows.UI.Xaml.InputMicrosoft.UI.Xaml.Input
    Windows.UI.Xaml.DataMicrosoft.UI.Xaml.Data
    Windows.UI.Xaml.NavigationMicrosoft.UI.Xaml.Navigation
    Windows.UI.Xaml.ShapesMicrosoft.UI.Xaml.Shapes
    Windows.UI.CompositionMicrosoft.UI.Composition
    Windows.UI.InputMicrosoft.UI.Input
    Windows.UI.ColorsMicrosoft.UI.Colors
    Windows.UI.TextMicrosoft.UI.Text
    Windows.UI.CoreMicrosoft.UI.Dispatching (for dispatcher)

    Top 3 Most Common Copilot Mistakes

    1. ContentDialog Without XamlRoot

    // ❌ WRONG — Throws InvalidOperationException in WinUI 3
    var dialog = new ContentDialog
    {
        Title = "Error",
        Content = "Something went wrong.",
        CloseButtonText = "OK"
    };
    await dialog.ShowAsync();
    
    // ✅ CORRECT — Set XamlRoot before showing
    var dialog = new ContentDialog
    {
        Title = "Error",
        Content = "Something went wrong.",
        CloseButtonText = "OK",
        XamlRoot = this.Content.XamlRoot  // Required in WinUI 3
    };
    await dialog.ShowAsync();
    

    2. MessageDialog Instead of ContentDialog

    // ❌ WRONG — UWP API, not available in WinUI 3 desktop
    var dialog = new Windows.UI.Popups.MessageDialog("Are you sure?", "Confirm");
    await dialog.ShowAsync();
    
    // ✅ CORRECT — Use ContentDialog
    var dialog = new ContentDialog
    {
        Title = "Confirm",
        Content = "Are you sure?",
        PrimaryButtonText = "Yes",
        CloseButtonText = "No",
        XamlRoot = this.Content.XamlRoot
    };
    var result = await dialog.ShowAsync();
    if (result == ContentDialogResult.Primary)
    {
        // User confirmed
    }
    

    3. CoreDispatcher Instead of DispatcherQueue

    // ❌ WRONG — CoreDispatcher does not exist in WinUI 3
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        StatusText.Text = "Done";
    });
    
    // ✅ CORRECT — Use DispatcherQueue
    DispatcherQueue.TryEnqueue(() =>
    {
        StatusText.Text = "Done";
    });
    
    // With priority:
    DispatcherQueue.TryEnqueue(DispatcherQueuePriority.High, () =>
    {
        ProgressBar.Value = 100;
    });
    

    Windowing Migration

    Window Reference

    // ❌ WRONG — Window.Current does not exist in WinUI 3
    var currentWindow = Window.Current;
    
    // ✅ CORRECT — Use a static property in App
    public partial class App : Application
    {
        public static Window MainWindow { get; private set; }
    
        protected override void OnLaunched(LaunchActivatedEventArgs args)
        {
            MainWindow = new MainWindow();
            MainWindow.Activate();
        }
    }
    // Access anywhere: App.MainWindow
    

    Window Management

    UWP APIWinUI 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 APIWinUI 3 API
    CoreApplicationViewTitleBarAppWindowTitleBar
    CoreApplicationView.TitleBar.ExtendViewIntoTitleBarAppWindow.TitleBar.ExtendsContentIntoTitleBar

    Dialogs and Pickers Migration

    File/Folder Pickers

    // ❌ WRONG — UWP style, no window handle
    var picker = new FileOpenPicker();
    picker.FileTypeFilter.Add(".txt");
    var file = await picker.PickSingleFileAsync();
    
    // ✅ CORRECT — Initialize with window handle
    var picker = new FileOpenPicker();
    var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
    WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd);
    picker.FileTypeFilter.Add(".txt");
    var file = await picker.PickSingleFileAsync();
    

    Threading Migration

    UWP PatternWinUI 3 Equivalent
    CoreDispatcher.RunAsync(priority, callback)DispatcherQueue.TryEnqueue(priority, callback)
    Dispatcher.HasThreadAccessDispatcherQueue.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

    // ❌ WRONG — UWP IBackgroundTask
    public sealed class MyTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance) { }
    }
    
    // ✅ CORRECT — Windows App SDK AppLifecycle
    using Microsoft.Windows.AppLifecycle;
    
    // Register for activation
    var args = AppInstance.GetCurrent().GetActivatedEventArgs();
    if (args.Kind == ExtendedActivationKind.AppNotification)
    {
        // Handle background activation
    }
    

    App Settings Migration

    ScenarioPackaged AppUnpackaged App
    Simple settingsApplicationData.Current.LocalSettingsJSON file in LocalApplicationData
    Local file storageApplicationData.Current.LocalFolderEnvironment.GetFolderPath(SpecialFolder.LocalApplicationData)

    GetForCurrentView() Replacements

    All GetForCurrentView() patterns are unavailable in WinUI 3 desktop apps:

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

    UWPWinUI 3
    Unit Test App (Universal Windows)Unit Test App (WinUI in Desktop)
    Standard MSTest project with UWP typesMust 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)
    // ✅ WinUI 3 unit test — use [UITestMethod] for any XAML interaction
    [UITestMethod]
    public void TestMyControl()
    {
        var control = new MyLibrary.MyUserControl();
        Assert.AreEqual(expected, control.MyProperty);
    }
    

    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

    Alternatives

    Compare before choosing