📦 deps(thirdparty): update snapshots

This commit is contained in:
ci[bot]
2026-08-14 17:16:04 +08:00
parent ad5eeaaf5b
commit 14e7209e78
283 changed files with 201717 additions and 13469 deletions
+56 -56
View File
@@ -1,56 +1,56 @@
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL
1,XAML,Use x:Bind for compiled bindings,Compile-time validated bindings with better performance,x:Bind for type-safe performant bindings,{Binding} when x:Bind is available,"<TextBlock Text=""{x:Bind ViewModel.Name, Mode=OneWay}""/>","<TextBlock Text=""{Binding Name}""/>",High,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension
2,XAML,Use x:Load for deferred elements,Delay creation of elements until needed,x:Load=False for hidden or conditional panels,Loading all UI elements at page load,"<StackPanel x:Name=""AdvancedPanel"" x:Load=""{x:Bind ShowAdvanced, Mode=OneWay}"">","Collapsed StackPanel that is always instantiated",Medium,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-load-attribute
3,XAML,Use x:Phase for incremental item rendering,Render list items in priority phases,x:Phase on secondary content in item DataTemplates,All template content loaded in one pass,"<TextBlock x:Phase=""1"" Text=""{x:Bind Description}""/>","Complex DataTemplate with no phasing",Medium,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-phase-attribute
4,XAML,Use x:DefaultBindMode,Reduce repetitive Mode= declarations,x:DefaultBindMode=OneWay on containers,Mode=OneWay on every individual x:Bind,"<StackPanel x:DefaultBindMode=""OneWay"">","Mode=OneWay repeated on every binding in a panel",Low,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension
5,XAML,Use x:DeferLoadStrategy for legacy support,Deferred loading before x:Load was available,x:Load (preferred) or x:DeferLoadStrategy=Lazy,Eagerly loading rarely shown UI,"x:Load=""False"" (or x:DeferLoadStrategy=""Lazy"" on older targets)","Always-loaded panels toggled with Visibility",Low,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-deferloadstrategy-attribute
6,Controls,Use NavigationView for app shell,Standard UWP navigation pattern with hamburger menu,NavigationView for top-level navigation,Custom SplitView hamburger menu,"<NavigationView><NavigationView.MenuItems><NavigationViewItem Content=""Home"" Icon=""Home""/></NavigationView.MenuItems></NavigationView>","Custom SplitView with manual toggle button",High,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/navigationview
7,Controls,Use CommandBar for app actions,Standard app bar for primary commands,CommandBar with AppBarButtons,Custom StackPanel toolbar,"<CommandBar><AppBarButton Icon=""Save"" Label=""Save""/></CommandBar>","<StackPanel Orientation=""Horizontal""><Button>Save</Button></StackPanel>",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/ui/controls/command-bar
8,Controls,Use ContentDialog for modals,System-styled modal dialogs,ContentDialog for confirmations and input,Custom popup overlays,"<ContentDialog Title=""Confirm"" PrimaryButtonText=""Yes"" CloseButtonText=""No""/>","Grid overlay with manual focus trapping",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts/dialogs
9,Controls,Use AutoSuggestBox for search,Built-in search box with suggestions,AutoSuggestBox with QuerySubmitted and SuggestionChosen,TextBox with manual suggestion popup,"<AutoSuggestBox QueryIcon=""Find"" TextChanged=""OnTextChanged"" SuggestionChosen=""OnChosen"" QuerySubmitted=""OnQuerySubmitted""/>","TextBox with custom Popup and ListBox for suggestions",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/auto-suggest-box
10,Controls,Use CalendarDatePicker and TimePicker,Platform-consistent date and time selection,Built-in date and time pickers,Custom date selection controls,"<CalendarDatePicker Header=""Start date""/><TimePicker Header=""Time""/>","TextBox with date parsing and validation",Low,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/date-and-time
11,Controls,Use PersonPicture for user avatars,Consistent avatar display with fallback initials,PersonPicture with DisplayName and ProfilePicture,Custom Ellipse with ImageBrush for avatars,"<PersonPicture DisplayName=""Jane Doe"" ProfilePicture=""{x:Bind AvatarUri}""/>","<Ellipse><Ellipse.Fill><ImageBrush ImageSource=""avatar.png""/></Ellipse.Fill></Ellipse>",Low,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/person-picture
12,Styling,Use ThemeResource for adaptive colors,Colors that switch with light and dark theme,ThemeResource for all color references,Hardcoded hex values that break in dark mode,"Foreground=""{ThemeResource SystemControlForegroundBaseHighBrush}""","Foreground=""#000000""",High,https://learn.microsoft.com/en-us/windows/uwp/design/style/color
13,Styling,Use Fluent Design materials,Acrylic translucent material for depth,Built-in Fluent materials for depth and motion,Custom shader effects for blur and reveal,"<Grid Background=""{ThemeResource SystemControlAcrylicWindowBrush}""/>","Custom CompositionEffectBrush recreating acrylic",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/style/acrylic
14,Styling,Use Lightweight Styling,Override control resource keys for subtle changes,Lightweight styling resource overrides,Full ControlTemplate copy for small tweaks,"<Button><Button.Resources><SolidColorBrush x:Key=""ButtonBackground"" Color=""Blue""/></Button.Resources></Button>","Entire ControlTemplate copied to change background",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/xaml-styles#lightweight-styling
15,Styling,Use implicit styles for consistency,TargetType without x:Key applies to all instances,Implicit Style for default control appearance,Repeating Setters on every control instance,"<Style TargetType=""Button""><Setter Property=""CornerRadius"" Value=""4""/></Style>","CornerRadius=""4"" on every Button in the page",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/xaml-styles
16,Styling,Use VisualStateManager for visual states,Define visual states with Setters that change properties when triggered,VisualStateGroup containing VisualStates with Setter targets,Toggling Visibility from code-behind on SizeChanged,"<VisualStateGroup><VisualState x:Name=""Wide""><VisualState.Setters><Setter Target=""root.Orientation"" Value=""Horizontal""/></VisualState.Setters></VisualState></VisualStateGroup>","SizeChanged handler that flips Orientation in code-behind",High,https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml
17,Navigation,Use Frame for page navigation,Windows.UI.Xaml.Controls.Frame for UWP page navigation,Frame.Navigate with typed parameters,Swapping UserControls manually,"rootFrame.Navigate(typeof(DetailPage), itemId);","contentArea.Content = new DetailPage();",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/basics/navigate-between-two-pages
18,Navigation,Handle back button correctly,Provide an in-app Back button styled with NavigationBackButtonNormalStyle and handle SystemNavigationManager.BackRequested for hardware back gamepad B and Tablet-Mode back; also handle CoreDispatcher.AcceleratorKeyActivated for Alt+Left,In-app NavigationBackButtonNormalStyle button plus SystemNavigationManager.BackRequested handler,Relying on the deprecated title-bar back button (AppViewBackButtonVisibility) or ignoring system back signals,"SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;","No back button support on phone or tablet",High,https://learn.microsoft.com/en-us/windows/uwp/ui-input/back-navigation
19,Navigation,Support deep linking with protocol activation,Respond to URI activation and toast taps,OnActivated handler with proper page routing,Ignoring activation arguments,"protected override void OnActivated(IActivatedEventArgs args) { if (args.Kind == ActivationKind.Protocol) { ... } }","Empty OnActivated ignoring URI parameters",Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/handle-uri-activation
20,Navigation,Use ConnectedAnimations for continuity,Smooth transitions between pages,ConnectedAnimationService for shared element transitions,Abrupt page transitions with no visual continuity,"ConnectedAnimationService.GetForCurrentView().PrepareToAnimate(""image"", sourceImage);","No transition animation between list and detail",Low,https://learn.microsoft.com/en-us/windows/uwp/design/motion/connected-animation
21,Data Binding,Implement INotifyPropertyChanged,Enable UI updates on property changes,INotifyPropertyChanged on all ViewModels,Auto-properties without notification,"public string Title { get => _title; set { _title = value; OnPropertyChanged(); } }","public string Title { get; set; } expecting UI updates",High,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth
22,Data Binding,Use ObservableCollection for lists,Collection change notifications for ItemsSources,ObservableCollection<T> for bound lists,List<T> for data-bound collections,"ObservableCollection<Item> Items { get; } = new();","List<Item> Items { get; set; } = new();",High,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth
23,Data Binding,Use function bindings with x:Bind,Call static methods directly in markup,x:Bind to static converter methods,IValueConverter for trivial transforms,"<TextBlock Visibility=""{x:Bind local:Converters.BoolToVisibility(IsActive), Mode=OneWay}""/>","Full IValueConverter class for bool to Visibility",Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/function-bindings
24,Data Binding,Specify Mode on x:Bind,x:Bind defaults to OneTime not OneWay,Mode=OneWay or TwoWay when live updates needed,Omitting Mode and getting stale UI,"Text=""{x:Bind Title, Mode=OneWay}""","Text=""{x:Bind Title}"" expecting live updates",High,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension
25,Data Binding,Use CollectionViewSource for grouping,Group and sort collections declaratively,CollectionViewSource for grouped ListView and GridView,Manual grouping logic in code-behind,"<CollectionViewSource x:Key=""GroupedItems"" IsSourceGrouped=""True"" Source=""{x:Bind GroupedData}""/>","Manual loop building grouped StackPanels",Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth
26,Performance,Use ListView and GridView virtualization,Only creates containers for visible items,Default virtualization in ListView and GridView,Setting ItemsPanel to non-virtualizing panel,"<ListView ItemsSource=""{x:Bind Items}""/> (virtualizes by default)","<ListView><ListView.ItemsPanel><ItemsPanelTemplate><StackPanel/></ItemsPanelTemplate></ListView.ItemsPanel></ListView>",High,https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview
27,Performance,Use ISupportIncrementalLoading,Load data on demand as user scrolls,ISupportIncrementalLoading for large datasets,Loading entire collection upfront,"class IncrementalSource : ObservableCollection<Item>, ISupportIncrementalLoading","await LoadAll() loading 50K items at startup",Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth
28,Performance,Reduce XAML visual tree depth,Simpler trees layout and render faster,Flat templates with minimal nesting,Deeply nested panels in DataTemplates,"<StackPanel><TextBlock/><TextBlock/></StackPanel> in item template","<Grid><Border><StackPanel><Grid>... 8 levels in item template",Medium,https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-xaml-loading
29,Performance,Use compiled bindings in DataTemplates,x:Bind in templates requires x:DataType,x:DataType on DataTemplate for compiled bindings,{Binding} in item templates for large lists,"<DataTemplate x:DataType=""local:Item""><TextBlock Text=""{x:Bind Name}""/></DataTemplate>","<DataTemplate><TextBlock Text=""{Binding Name}""/></DataTemplate>",High,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension
30,Performance,Profile with Visual Studio diagnostics,Measure before optimizing,Application Timeline and Memory Usage tools,Guessing at performance problems,"VS Diagnostic Tools > Application Timeline","Optimizing without profiling data",Medium,https://learn.microsoft.com/en-us/visualstudio/profiling/application-timeline
31,Threading,Use async/await for all IO,Keep UI thread responsive,async/await for file network and database operations,Synchronous IO blocking the UI thread,"var file = await StorageFile.GetFileFromPathAsync(path);","StorageFile.GetFileFromPathAsync(path).AsTask().Result;",High,https://learn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform-apps
32,Threading,Use CoreDispatcher for UI thread access,Post work back to the UI thread from background,Dispatcher.RunAsync from background threads,Touching UI elements from background threads,"await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Status = ""Done"");","textBlock.Text = ""Done"" from Task.Run",High,https://learn.microsoft.com/en-us/uwp/api/windows.ui.core.coredispatcher
33,Threading,Offload CPU work with Task.Run,Keep compute-heavy work off UI thread,Task.Run for CPU-bound operations,Heavy computation blocking UI,"var result = await Task.Run(() => ProcessData(items));","var result = ProcessData(items); freezing UI",High,https://learn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform-apps
34,Threading,Use IProgress for status updates,Report progress from background operations,IProgress<T> for progress reporting to UI,Polling shared variables for progress,"var progress = new Progress<int>(p => ProgressBar.Value = p); await Task.Run(() => Process(progress));","while (!done) { await Task.Delay(100); check shared field; }",Medium,https://learn.microsoft.com/en-us/dotnet/api/system.progress-1
35,Adaptive,Use AdaptiveTrigger for responsive layouts,MinWindowWidth and MinWindowHeight triggers fire at standard breakpoints (640 small / 1008 medium),AdaptiveTrigger inside VisualState.StateTriggers with the 640 and 1008 breakpoints,Fixed layouts for a single screen size,"<VisualState.StateTriggers><AdaptiveTrigger MinWindowWidth=""640""/></VisualState.StateTriggers>","Single-column layout at all widths",High,https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml
36,Adaptive,Design for multiple device families,Phone tablet desktop Xbox and HoloLens,DeviceFamily-specific views and resources,Desktop-only design ignoring other form factors,"DeviceFamily-Mobile/MainPage.xaml for phone-specific layout","Fixed 1920x1080 layout",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/layout/screen-sizes-and-breakpoints-for-responsive-design
37,Adaptive,Use RelativePanel for adaptive positioning,Controls position relative to each other,RelativePanel for layouts that reflow at breakpoints,Absolute positioning or fixed margins,"<Button RelativePanel.Below=""title"" RelativePanel.AlignLeftWithPanel=""True""/>","<Button Margin=""0,60,0,0""/> calculated from title height",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml#relativepanel
38,Adaptive,Support multi-window with secondary views,Open detached views with CoreApplication.CreateNewView and ApplicationViewSwitcher,CreateNewView and TryShowAsStandaloneAsync for multi-document scenarios,Single-window assumptions when scenarios benefit from secondary views,"var view = CoreApplication.CreateNewView(); await view.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { /* set content */ });","Modal overlay used for content that should be a separate window",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/layout/show-multiple-views
39,Accessibility,Set AutomationProperties,Enable Narrator and screen reader support,AutomationProperties.Name on all interactive controls,Controls without accessible names,"<AppBarButton AutomationProperties.Name=""Save document"" Icon=""Save""/>","<AppBarButton Icon=""Save""/> without name",High,https://learn.microsoft.com/en-us/windows/uwp/design/accessibility/basic-accessibility-information
40,Accessibility,Support keyboard and gamepad,All functions reachable without touch,Tab navigation XYFocus and access keys,Touch-only interactions,"<Button AccessKey=""S"" XYFocusDown=""{x:Bind OtherButton}""/>","No keyboard or gamepad support",High,https://learn.microsoft.com/en-us/windows/uwp/design/input/keyboard-interactions
41,Accessibility,Support contrast themes,Respect system contrast themes (renamed from high contrast in Windows 11),ThemeResource brushes that adapt to contrast themes,Hardcoded colors that vanish under contrast themes,"Foreground=""{ThemeResource SystemControlForegroundBaseHighBrush}""","Foreground=""#444444""",High,https://learn.microsoft.com/en-us/windows/uwp/design/accessibility/high-contrast-themes
42,Accessibility,Test with Narrator and Accessibility Insights,Validate screen reader and automation compliance,Regular Narrator walkthrough and Accessibility Insights scan,Shipping without accessibility testing,"Accessibility Insights FastPass on every page","No accessibility testing before release",Medium,https://accessibilityinsights.io/
43,Architecture,Use MVVM pattern,Separate View ViewModel and Model,ViewModel with INotifyPropertyChanged and ICommand,Business logic in code-behind,"ViewModel bound via DataContext with commands","MainPage.xaml.cs with database calls and UI logic",Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-and-mvvm
44,Architecture,Use Template Studio for scaffolding,Proven project templates with navigation and services,Windows Template Studio for new UWP projects,Blank project with manual boilerplate,"Template Studio with MVVM Toolkit and navigation service","Blank App template building everything from scratch",Low,https://github.com/microsoft/TemplateStudio
45,Architecture,Use dependency injection,Register services for testability,Microsoft.Extensions.DI for service resolution,Static singletons and manual construction,"services.AddTransient<MainViewModel>(); services.AddSingleton<IDataService, DataService>();","DataService.Instance or new DataService() everywhere",Medium,https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection
46,Architecture,Keep platform APIs behind abstractions,Isolate WinRT APIs from business logic,Interfaces wrapping StorageFile FilePicker etc,Direct WinRT calls in ViewModels,"IFileService wrapping FileOpenPicker and StorageFile","FileOpenPicker usage directly in ViewModel",Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-and-mvvm
47,Lifecycle,Handle suspend and resume,UWP apps are suspended when not in foreground,Save state in OnSuspending and restore in OnLaunched,Ignoring app lifecycle losing user state,"Application.Current.Suspending += (s, e) => SaveState();","No suspend handler losing in-progress form data",High,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/app-lifecycle
48,Lifecycle,Use ExtendedExecutionSession for background work,Request extended time for unfinished operations,ExtendedExecutionSession for saving or uploads,Assuming background work completes after suspend,"var session = new ExtendedExecutionSession { Reason = ExtendedExecutionReason.SavingData };","Long upload with no extended execution that gets killed on suspend",Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/run-minimized-with-extended-execution
49,Lifecycle,Handle prelaunch,Apps must opt in to prelaunch via CoreApplication.EnablePrelaunch(true) starting in Windows 10 1607; check LaunchActivatedEventArgs.PrelaunchActivated to skip user-visible work,Opt in with EnablePrelaunch and skip heavy init when PrelaunchActivated is true,Performing full initialization or navigating during prelaunch,"CoreApplication.EnablePrelaunch(true); if (e.PrelaunchActivated) return; // skip heavy init","Loading all data and navigating on prelaunch",Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/handle-app-prelaunch
50,Testing,Unit test ViewModels,Test logic without UI framework dependencies,xUnit or MSTest on ViewModel methods,Testing only through the running app,"[Fact] public async Task Load_PopulatesItems() { await vm.LoadAsync(); Assert.NotEmpty(vm.Items); }","Manual testing by tapping through the app",Medium,https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices
51,Testing,Use WinAppDriver with Appium for UI tests,Automated UI testing for UWP (Coded UI Test was deprecated in Visual Studio 2019); WinAppDriver v1 is in low-maintenance mode and Appium 2 is the modern direction,WinAppDriver with Appium for end-to-end tests,Manual regression testing,"session.FindElementByAccessibilityId(""SaveButton"").Click();","Manual click-through testing before each release",Medium,https://github.com/microsoft/WinAppDriver
52,Testing,Test on multiple device families,Behavior varies across phone desktop and Xbox,Test on device emulators and real hardware,Desktop-only testing,"Test on Mobile emulator and Xbox dev mode","Only running on local desktop",Medium,https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal
53,Architecture,Prefer WinUI 3 for new projects,UWP is in maintenance mode and Microsoft recommends WinUI 3 and Windows App SDK for new development,WinUI 3 with Windows App SDK for new desktop apps,Starting new projects on UWP when WinUI 3 is available,"New project with Microsoft.WindowsAppSDK and WinUI 3","New UWP project for a desktop-only app in 2024+",Medium,https://learn.microsoft.com/en-us/windows/apps/get-started/
54,Architecture,Plan migration to Windows App SDK,Microsoft provides migration guides from UWP to WinUI 3,Incremental migration using XAML Islands or full port to WinUI 3,Ignoring migration path and accumulating UWP technical debt,"Follow UWP to WinUI 3 migration guide for existing apps","Continuing major feature development on UWP without migration plan",Medium,https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/overall-migration-strategy
55,Lifecycle,Use a deferral when saving async state on suspend,Suspending grants only ~5 seconds before the OS may terminate; await work needs SuspendingOperation.GetDeferral and Complete or save returns before it finishes,GetDeferral around async save calls and Complete in finally,Async work that returns the suspending handler before completion,"async void OnSuspending(object s, SuspendingEventArgs e) { var d = e.SuspendingOperation.GetDeferral(); try { await SaveAsync(); } finally { d.Complete(); } }","async void OnSuspending(object s, SuspendingEventArgs e) { await SaveAsync(); } // handler returns before save completes",Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/app-lifecycle
No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL,Applies To,Status,Verified At
1,XAML,Use x:Bind for compiled bindings,Compile-time validated bindings with better performance,x:Bind for type-safe performant bindings,{Binding} when x:Bind is available,"<TextBlock Text=""{x:Bind ViewModel.Name, Mode=OneWay}""/>","<TextBlock Text=""{Binding Name}""/>",High,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension,uwp legacy,deprecated,2026-08-13
2,XAML,Use x:Load for deferred elements,Delay creation of elements until needed,x:Load=False for hidden or conditional panels,Loading all UI elements at page load,"<StackPanel x:Name=""AdvancedPanel"" x:Load=""{x:Bind ShowAdvanced, Mode=OneWay}"">",Collapsed StackPanel that is always instantiated,Medium,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-load-attribute,uwp legacy,deprecated,2026-08-13
3,XAML,Use x:Phase for incremental item rendering,Render list items in priority phases,x:Phase on secondary content in item DataTemplates,All template content loaded in one pass,"<TextBlock x:Phase=""1"" Text=""{x:Bind Description}""/>",Complex DataTemplate with no phasing,Medium,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-phase-attribute,uwp legacy,deprecated,2026-08-13
4,XAML,Use x:DefaultBindMode,Reduce repetitive Mode= declarations,x:DefaultBindMode=OneWay on containers,Mode=OneWay on every individual x:Bind,"<StackPanel x:DefaultBindMode=""OneWay"">",Mode=OneWay repeated on every binding in a panel,Low,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension,uwp legacy,deprecated,2026-08-13
5,XAML,Use x:DeferLoadStrategy for legacy support,Deferred loading before x:Load was available,x:Load (preferred) or x:DeferLoadStrategy=Lazy,Eagerly loading rarely shown UI,"x:Load=""False"" (or x:DeferLoadStrategy=""Lazy"" on older targets)",Always-loaded panels toggled with Visibility,Low,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-deferloadstrategy-attribute,uwp legacy,deprecated,2026-08-13
6,Controls,Use NavigationView for app shell,Standard UWP navigation pattern with hamburger menu,NavigationView for top-level navigation,Custom SplitView hamburger menu,"<NavigationView><NavigationView.MenuItems><NavigationViewItem Content=""Home"" Icon=""Home""/></NavigationView.MenuItems></NavigationView>",Custom SplitView with manual toggle button,High,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/navigationview,uwp legacy,deprecated,2026-08-13
7,Controls,Use CommandBar for app actions,Standard app bar for primary commands,CommandBar with AppBarButtons,Custom StackPanel toolbar,"<CommandBar><AppBarButton Icon=""Save"" Label=""Save""/></CommandBar>","<StackPanel Orientation=""Horizontal""><Button>Save</Button></StackPanel>",Medium,https://learn.microsoft.com/en-us/windows/apps/develop/ui/controls/command-bar,uwp legacy,deprecated,2026-08-13
8,Controls,Use ContentDialog for modals,System-styled modal dialogs,ContentDialog for confirmations and input,Custom popup overlays,"<ContentDialog Title=""Confirm"" PrimaryButtonText=""Yes"" CloseButtonText=""No""/>",Grid overlay with manual focus trapping,Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts/dialogs,uwp legacy,deprecated,2026-08-13
9,Controls,Use AutoSuggestBox for search,Built-in search box with suggestions,AutoSuggestBox with QuerySubmitted and SuggestionChosen,TextBox with manual suggestion popup,"<AutoSuggestBox QueryIcon=""Find"" TextChanged=""OnTextChanged"" SuggestionChosen=""OnChosen"" QuerySubmitted=""OnQuerySubmitted""/>",TextBox with custom Popup and ListBox for suggestions,Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/auto-suggest-box,uwp legacy,deprecated,2026-08-13
10,Controls,Use CalendarDatePicker and TimePicker,Platform-consistent date and time selection,Built-in date and time pickers,Custom date selection controls,"<CalendarDatePicker Header=""Start date""/><TimePicker Header=""Time""/>",TextBox with date parsing and validation,Low,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/date-and-time,uwp legacy,deprecated,2026-08-13
11,Controls,Use PersonPicture for user avatars,Consistent avatar display with fallback initials,PersonPicture with DisplayName and ProfilePicture,Custom Ellipse with ImageBrush for avatars,"<PersonPicture DisplayName=""Jane Doe"" ProfilePicture=""{x:Bind AvatarUri}""/>","<Ellipse><Ellipse.Fill><ImageBrush ImageSource=""avatar.png""/></Ellipse.Fill></Ellipse>",Low,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/person-picture,uwp legacy,deprecated,2026-08-13
12,Styling,Use ThemeResource for adaptive colors,Colors that switch with light and dark theme,ThemeResource for all color references,Hardcoded hex values that break in dark mode,"Foreground=""{ThemeResource SystemControlForegroundBaseHighBrush}""","Foreground=""#000000""",High,https://learn.microsoft.com/en-us/windows/uwp/design/style/color,uwp legacy,deprecated,2026-08-13
13,Styling,Use Fluent Design materials,Acrylic translucent material for depth,Built-in Fluent materials for depth and motion,Custom shader effects for blur and reveal,"<Grid Background=""{ThemeResource SystemControlAcrylicWindowBrush}""/>",Custom CompositionEffectBrush recreating acrylic,Medium,https://learn.microsoft.com/en-us/windows/uwp/design/style/acrylic,uwp legacy,deprecated,2026-08-13
14,Styling,Use Lightweight Styling,Override control resource keys for subtle changes,Lightweight styling resource overrides,Full ControlTemplate copy for small tweaks,"<Button><Button.Resources><SolidColorBrush x:Key=""ButtonBackground"" Color=""Blue""/></Button.Resources></Button>",Entire ControlTemplate copied to change background,Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/xaml-styles#lightweight-styling,uwp legacy,deprecated,2026-08-13
15,Styling,Use implicit styles for consistency,TargetType without x:Key applies to all instances,Implicit Style for default control appearance,Repeating Setters on every control instance,"<Style TargetType=""Button""><Setter Property=""CornerRadius"" Value=""4""/></Style>","CornerRadius=""4"" on every Button in the page",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/xaml-styles,uwp legacy,deprecated,2026-08-13
16,Styling,Use VisualStateManager for visual states,Define visual states with Setters that change properties when triggered,VisualStateGroup containing VisualStates with Setter targets,Toggling Visibility from code-behind on SizeChanged,"<VisualStateGroup><VisualState x:Name=""Wide""><VisualState.Setters><Setter Target=""root.Orientation"" Value=""Horizontal""/></VisualState.Setters></VisualState></VisualStateGroup>",SizeChanged handler that flips Orientation in code-behind,High,https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml,uwp legacy,deprecated,2026-08-13
17,Navigation,Use Frame for page navigation,Windows.UI.Xaml.Controls.Frame for UWP page navigation,Frame.Navigate with typed parameters,Swapping UserControls manually,"rootFrame.Navigate(typeof(DetailPage), itemId);",contentArea.Content = new DetailPage();,Medium,https://learn.microsoft.com/en-us/windows/uwp/design/basics/navigate-between-two-pages,uwp legacy,deprecated,2026-08-13
18,Navigation,Handle back button correctly,Provide an in-app Back button styled with NavigationBackButtonNormalStyle and handle SystemNavigationManager.BackRequested for hardware back gamepad B and Tablet-Mode back; also handle CoreDispatcher.AcceleratorKeyActivated for Alt+Left,In-app NavigationBackButtonNormalStyle button plus SystemNavigationManager.BackRequested handler,Relying on the deprecated title-bar back button (AppViewBackButtonVisibility) or ignoring system back signals,SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;,No back button support on phone or tablet,High,https://learn.microsoft.com/en-us/windows/uwp/ui-input/back-navigation,uwp legacy,deprecated,2026-08-13
19,Navigation,Support deep linking with protocol activation,Respond to URI activation and toast taps,OnActivated handler with proper page routing,Ignoring activation arguments,protected override void OnActivated(IActivatedEventArgs args) { if (args.Kind == ActivationKind.Protocol) { ... } },Empty OnActivated ignoring URI parameters,Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/handle-uri-activation,uwp legacy,deprecated,2026-08-13
20,Navigation,Use ConnectedAnimations for continuity,Smooth transitions between pages,ConnectedAnimationService for shared element transitions,Abrupt page transitions with no visual continuity,"ConnectedAnimationService.GetForCurrentView().PrepareToAnimate(""image"", sourceImage);",No transition animation between list and detail,Low,https://learn.microsoft.com/en-us/windows/uwp/design/motion/connected-animation,uwp legacy,deprecated,2026-08-13
21,Data Binding,Implement INotifyPropertyChanged,Enable UI updates on property changes,INotifyPropertyChanged on all ViewModels,Auto-properties without notification,public string Title { get => _title; set { _title = value; OnPropertyChanged(); } },public string Title { get; set; } expecting UI updates,High,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth,uwp legacy,deprecated,2026-08-13
22,Data Binding,Use ObservableCollection for lists,Collection change notifications for ItemsSources,ObservableCollection<T> for bound lists,List<T> for data-bound collections,ObservableCollection<Item> Items { get; } = new();,List<Item> Items { get; set; } = new();,High,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth,uwp legacy,deprecated,2026-08-13
23,Data Binding,Use function bindings with x:Bind,Call static methods directly in markup,x:Bind to static converter methods,IValueConverter for trivial transforms,"<TextBlock Visibility=""{x:Bind local:Converters.BoolToVisibility(IsActive), Mode=OneWay}""/>",Full IValueConverter class for bool to Visibility,Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/function-bindings,uwp legacy,deprecated,2026-08-13
24,Data Binding,Specify Mode on x:Bind,x:Bind defaults to OneTime not OneWay,Mode=OneWay or TwoWay when live updates needed,Omitting Mode and getting stale UI,"Text=""{x:Bind Title, Mode=OneWay}""","Text=""{x:Bind Title}"" expecting live updates",High,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension,uwp legacy,deprecated,2026-08-13
25,Data Binding,Use CollectionViewSource for grouping,Group and sort collections declaratively,CollectionViewSource for grouped ListView and GridView,Manual grouping logic in code-behind,"<CollectionViewSource x:Key=""GroupedItems"" IsSourceGrouped=""True"" Source=""{x:Bind GroupedData}""/>",Manual loop building grouped StackPanels,Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth,uwp legacy,deprecated,2026-08-13
26,Performance,Use ListView and GridView virtualization,Only creates containers for visible items,Default virtualization in ListView and GridView,Setting ItemsPanel to non-virtualizing panel,"<ListView ItemsSource=""{x:Bind Items}""/> (virtualizes by default)",<ListView><ListView.ItemsPanel><ItemsPanelTemplate><StackPanel/></ItemsPanelTemplate></ListView.ItemsPanel></ListView>,High,https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview,uwp legacy,deprecated,2026-08-13
27,Performance,Use ISupportIncrementalLoading,Load data on demand as user scrolls,ISupportIncrementalLoading for large datasets,Loading entire collection upfront,"class IncrementalSource : ObservableCollection<Item>, ISupportIncrementalLoading",await LoadAll() loading 50K items at startup,Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth,uwp legacy,deprecated,2026-08-13
28,Performance,Reduce XAML visual tree depth,Simpler trees layout and render faster,Flat templates with minimal nesting,Deeply nested panels in DataTemplates,<StackPanel><TextBlock/><TextBlock/></StackPanel> in item template,<Grid><Border><StackPanel><Grid>... 8 levels in item template,Medium,https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-xaml-loading,uwp legacy,deprecated,2026-08-13
29,Performance,Use compiled bindings in DataTemplates,x:Bind in templates requires x:DataType,x:DataType on DataTemplate for compiled bindings,{Binding} in item templates for large lists,"<DataTemplate x:DataType=""local:Item""><TextBlock Text=""{x:Bind Name}""/></DataTemplate>","<DataTemplate><TextBlock Text=""{Binding Name}""/></DataTemplate>",High,https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension,uwp legacy,deprecated,2026-08-13
30,Performance,Profile with Visual Studio diagnostics,Measure before optimizing,Application Timeline and Memory Usage tools,Guessing at performance problems,VS Diagnostic Tools > Application Timeline,Optimizing without profiling data,Medium,https://learn.microsoft.com/en-us/visualstudio/profiling/application-timeline,uwp legacy,deprecated,2026-08-13
31,Threading,Use async/await for all IO,Keep UI thread responsive,async/await for file network and database operations,Synchronous IO blocking the UI thread,var file = await StorageFile.GetFileFromPathAsync(path);,StorageFile.GetFileFromPathAsync(path).AsTask().Result;,High,https://learn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform-apps,uwp legacy,deprecated,2026-08-13
32,Threading,Use CoreDispatcher for UI thread access,Post work back to the UI thread from background,Dispatcher.RunAsync from background threads,Touching UI elements from background threads,"await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Status = ""Done"");","textBlock.Text = ""Done"" from Task.Run",High,https://learn.microsoft.com/en-us/uwp/api/windows.ui.core.coredispatcher,uwp legacy,deprecated,2026-08-13
33,Threading,Offload CPU work with Task.Run,Keep compute-heavy work off UI thread,Task.Run for CPU-bound operations,Heavy computation blocking UI,var result = await Task.Run(() => ProcessData(items));,var result = ProcessData(items); freezing UI,High,https://learn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform-apps,uwp legacy,deprecated,2026-08-13
34,Threading,Use IProgress for status updates,Report progress from background operations,IProgress<T> for progress reporting to UI,Polling shared variables for progress,var progress = new Progress<int>(p => ProgressBar.Value = p); await Task.Run(() => Process(progress));,while (!done) { await Task.Delay(100); check shared field; },Medium,https://learn.microsoft.com/en-us/dotnet/api/system.progress-1,uwp legacy,deprecated,2026-08-13
35,Adaptive,Use AdaptiveTrigger for responsive layouts,MinWindowWidth and MinWindowHeight triggers fire at standard breakpoints (640 small / 1008 medium),AdaptiveTrigger inside VisualState.StateTriggers with the 640 and 1008 breakpoints,Fixed layouts for a single screen size,"<VisualState.StateTriggers><AdaptiveTrigger MinWindowWidth=""640""/></VisualState.StateTriggers>",Single-column layout at all widths,High,https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml,uwp legacy,deprecated,2026-08-13
36,Adaptive,Design for multiple device families,Phone tablet desktop Xbox and HoloLens,DeviceFamily-specific views and resources,Desktop-only design ignoring other form factors,DeviceFamily-Mobile/MainPage.xaml for phone-specific layout,Fixed 1920x1080 layout,Medium,https://learn.microsoft.com/en-us/windows/uwp/design/layout/screen-sizes-and-breakpoints-for-responsive-design,uwp legacy,deprecated,2026-08-13
37,Adaptive,Use RelativePanel for adaptive positioning,Controls position relative to each other,RelativePanel for layouts that reflow at breakpoints,Absolute positioning or fixed margins,"<Button RelativePanel.Below=""title"" RelativePanel.AlignLeftWithPanel=""True""/>","<Button Margin=""0,60,0,0""/> calculated from title height",Medium,https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml#relativepanel,uwp legacy,deprecated,2026-08-13
38,Adaptive,Support multi-window with secondary views,Open detached views with CoreApplication.CreateNewView and ApplicationViewSwitcher,CreateNewView and TryShowAsStandaloneAsync for multi-document scenarios,Single-window assumptions when scenarios benefit from secondary views,"var view = CoreApplication.CreateNewView(); await view.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { /* set content */ });",Modal overlay used for content that should be a separate window,Medium,https://learn.microsoft.com/en-us/windows/uwp/design/layout/show-multiple-views,uwp legacy,deprecated,2026-08-13
39,Accessibility,Set AutomationProperties,Enable Narrator and screen reader support,AutomationProperties.Name on all interactive controls,Controls without accessible names,"<AppBarButton AutomationProperties.Name=""Save document"" Icon=""Save""/>","<AppBarButton Icon=""Save""/> without name",High,https://learn.microsoft.com/en-us/windows/uwp/design/accessibility/basic-accessibility-information,uwp legacy,deprecated,2026-08-13
40,Accessibility,Support keyboard and gamepad,All functions reachable without touch,Tab navigation XYFocus and access keys,Touch-only interactions,"<Button AccessKey=""S"" XYFocusDown=""{x:Bind OtherButton}""/>",No keyboard or gamepad support,High,https://learn.microsoft.com/en-us/windows/uwp/design/input/keyboard-interactions,uwp legacy,deprecated,2026-08-13
41,Accessibility,Support contrast themes,Respect system contrast themes (renamed from high contrast in Windows 11),ThemeResource brushes that adapt to contrast themes,Hardcoded colors that vanish under contrast themes,"Foreground=""{ThemeResource SystemControlForegroundBaseHighBrush}""","Foreground=""#444444""",High,https://learn.microsoft.com/en-us/windows/uwp/design/accessibility/high-contrast-themes,uwp legacy,deprecated,2026-08-13
42,Accessibility,Test with Narrator and Accessibility Insights,Validate screen reader and automation compliance,Regular Narrator walkthrough and Accessibility Insights scan,Shipping without accessibility testing,Accessibility Insights FastPass on every page,No accessibility testing before release,Medium,https://accessibilityinsights.io/,uwp legacy,deprecated,2026-08-13
43,Architecture,Use MVVM pattern,Separate View ViewModel and Model,ViewModel with INotifyPropertyChanged and ICommand,Business logic in code-behind,ViewModel bound via DataContext with commands,MainPage.xaml.cs with database calls and UI logic,Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-and-mvvm,uwp legacy,deprecated,2026-08-13
44,Architecture,Use Template Studio for scaffolding,Proven project templates with navigation and services,Windows Template Studio for new UWP projects,Blank project with manual boilerplate,Template Studio with MVVM Toolkit and navigation service,Blank App template building everything from scratch,Low,https://github.com/microsoft/TemplateStudio,uwp legacy,deprecated,2026-08-13
45,Architecture,Use dependency injection,Register services for testability,Microsoft.Extensions.DI for service resolution,Static singletons and manual construction,"services.AddTransient<MainViewModel>(); services.AddSingleton<IDataService, DataService>();",DataService.Instance or new DataService() everywhere,Medium,https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection,uwp legacy,deprecated,2026-08-13
46,Architecture,Keep platform APIs behind abstractions,Isolate WinRT APIs from business logic,Interfaces wrapping StorageFile FilePicker etc,Direct WinRT calls in ViewModels,IFileService wrapping FileOpenPicker and StorageFile,FileOpenPicker usage directly in ViewModel,Medium,https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-and-mvvm,uwp legacy,deprecated,2026-08-13
47,Lifecycle,Handle suspend and resume,UWP apps are suspended when not in foreground,Save state in OnSuspending and restore in OnLaunched,Ignoring app lifecycle losing user state,"Application.Current.Suspending += (s, e) => SaveState();",No suspend handler losing in-progress form data,High,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/app-lifecycle,uwp legacy,deprecated,2026-08-13
48,Lifecycle,Use ExtendedExecutionSession for background work,Request extended time for unfinished operations,ExtendedExecutionSession for saving or uploads,Assuming background work completes after suspend,var session = new ExtendedExecutionSession { Reason = ExtendedExecutionReason.SavingData };,Long upload with no extended execution that gets killed on suspend,Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/run-minimized-with-extended-execution,uwp legacy,deprecated,2026-08-13
49,Lifecycle,Handle prelaunch,Apps must opt in to prelaunch via CoreApplication.EnablePrelaunch(true) starting in Windows 10 1607; check LaunchActivatedEventArgs.PrelaunchActivated to skip user-visible work,Opt in with EnablePrelaunch and skip heavy init when PrelaunchActivated is true,Performing full initialization or navigating during prelaunch,CoreApplication.EnablePrelaunch(true); if (e.PrelaunchActivated) return; // skip heavy init,Loading all data and navigating on prelaunch,Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/handle-app-prelaunch,uwp legacy,deprecated,2026-08-13
50,Testing,Unit test ViewModels,Test logic without UI framework dependencies,xUnit or MSTest on ViewModel methods,Testing only through the running app,[Fact] public async Task Load_PopulatesItems() { await vm.LoadAsync(); Assert.NotEmpty(vm.Items); },Manual testing by tapping through the app,Medium,https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices,uwp legacy,deprecated,2026-08-13
51,Testing,Use WinAppDriver with Appium for UI tests,Automated UI testing for UWP (Coded UI Test was deprecated in Visual Studio 2019); WinAppDriver v1 is in low-maintenance mode and Appium 2 is the modern direction,WinAppDriver with Appium for end-to-end tests,Manual regression testing,"session.FindElementByAccessibilityId(""SaveButton"").Click();",Manual click-through testing before each release,Medium,https://github.com/microsoft/WinAppDriver,uwp legacy,deprecated,2026-08-13
52,Testing,Test on multiple device families,Behavior varies across phone desktop and Xbox,Test on device emulators and real hardware,Desktop-only testing,Test on Mobile emulator and Xbox dev mode,Only running on local desktop,Medium,https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal,uwp legacy,deprecated,2026-08-13
53,Architecture,Prefer WinUI 3 for new projects,UWP is maintenance-only; WinUI 3 with the Windows App SDK is the recommended path for new Windows apps,Use WinUI 3 with the Windows App SDK for every new Windows app,Start a new Windows app on UWP,New project with Microsoft.WindowsAppSDK and WinUI 3,New UWP project for a Windows app,Medium,https://learn.microsoft.com/en-us/windows/apps/get-started/,uwp legacy,deprecated,2026-08-13
54,Architecture,Plan migration to Windows App SDK,Maintain existing UWP apps while planning migration to WinUI 3 and the Windows App SDK; do not expand UWP as the foundation for new Windows development,Use the UWP migration guidance to plan an incremental migration or full port to WinUI 3,Continue major new-app investment on UWP without a Windows App SDK migration plan,Follow the UWP to WinUI 3 migration guide for existing apps,Start a new Windows app on UWP instead of WinUI 3,Medium,https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/overall-migration-strategy,uwp legacy,deprecated,2026-08-13
55,Lifecycle,Use a deferral when saving async state on suspend,Suspending grants only ~5 seconds before the OS may terminate; await work needs SuspendingOperation.GetDeferral and Complete or save returns before it finishes,GetDeferral around async save calls and Complete in finally,Async work that returns the suspending handler before completion,"async void OnSuspending(object s, SuspendingEventArgs e) { var d = e.SuspendingOperation.GetDeferral(); try { await SaveAsync(); } finally { d.Complete(); } }","async void OnSuspending(object s, SuspendingEventArgs e) { await SaveAsync(); } // handler returns before save completes",Medium,https://learn.microsoft.com/en-us/windows/uwp/launch-resume/app-lifecycle,uwp legacy,deprecated,2026-08-13
1 No Category Guideline Description Do Don't Code Good Code Bad Severity Docs URL Applies To Status Verified At
2 1 XAML Use x:Bind for compiled bindings Compile-time validated bindings with better performance x:Bind for type-safe performant bindings {Binding} when x:Bind is available <TextBlock Text="{x:Bind ViewModel.Name, Mode=OneWay}"/> <TextBlock Text="{Binding Name}"/> High https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension uwp legacy deprecated 2026-08-13
3 2 XAML Use x:Load for deferred elements Delay creation of elements until needed x:Load=False for hidden or conditional panels Loading all UI elements at page load <StackPanel x:Name="AdvancedPanel" x:Load="{x:Bind ShowAdvanced, Mode=OneWay}"> Collapsed StackPanel that is always instantiated Medium https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-load-attribute uwp legacy deprecated 2026-08-13
4 3 XAML Use x:Phase for incremental item rendering Render list items in priority phases x:Phase on secondary content in item DataTemplates All template content loaded in one pass <TextBlock x:Phase="1" Text="{x:Bind Description}"/> Complex DataTemplate with no phasing Medium https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-phase-attribute uwp legacy deprecated 2026-08-13
5 4 XAML Use x:DefaultBindMode Reduce repetitive Mode= declarations x:DefaultBindMode=OneWay on containers Mode=OneWay on every individual x:Bind <StackPanel x:DefaultBindMode="OneWay"> Mode=OneWay repeated on every binding in a panel Low https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension uwp legacy deprecated 2026-08-13
6 5 XAML Use x:DeferLoadStrategy for legacy support Deferred loading before x:Load was available x:Load (preferred) or x:DeferLoadStrategy=Lazy Eagerly loading rarely shown UI x:Load="False" (or x:DeferLoadStrategy="Lazy" on older targets) Always-loaded panels toggled with Visibility Low https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-deferloadstrategy-attribute uwp legacy deprecated 2026-08-13
7 6 Controls Use NavigationView for app shell Standard UWP navigation pattern with hamburger menu NavigationView for top-level navigation Custom SplitView hamburger menu <NavigationView><NavigationView.MenuItems><NavigationViewItem Content="Home" Icon="Home"/></NavigationView.MenuItems></NavigationView> Custom SplitView with manual toggle button High https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/navigationview uwp legacy deprecated 2026-08-13
8 7 Controls Use CommandBar for app actions Standard app bar for primary commands CommandBar with AppBarButtons Custom StackPanel toolbar <CommandBar><AppBarButton Icon="Save" Label="Save"/></CommandBar> <StackPanel Orientation="Horizontal"><Button>Save</Button></StackPanel> Medium https://learn.microsoft.com/en-us/windows/apps/develop/ui/controls/command-bar uwp legacy deprecated 2026-08-13
9 8 Controls Use ContentDialog for modals System-styled modal dialogs ContentDialog for confirmations and input Custom popup overlays <ContentDialog Title="Confirm" PrimaryButtonText="Yes" CloseButtonText="No"/> Grid overlay with manual focus trapping Medium https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts/dialogs uwp legacy deprecated 2026-08-13
10 9 Controls Use AutoSuggestBox for search Built-in search box with suggestions AutoSuggestBox with QuerySubmitted and SuggestionChosen TextBox with manual suggestion popup <AutoSuggestBox QueryIcon="Find" TextChanged="OnTextChanged" SuggestionChosen="OnChosen" QuerySubmitted="OnQuerySubmitted"/> TextBox with custom Popup and ListBox for suggestions Medium https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/auto-suggest-box uwp legacy deprecated 2026-08-13
11 10 Controls Use CalendarDatePicker and TimePicker Platform-consistent date and time selection Built-in date and time pickers Custom date selection controls <CalendarDatePicker Header="Start date"/><TimePicker Header="Time"/> TextBox with date parsing and validation Low https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/date-and-time uwp legacy deprecated 2026-08-13
12 11 Controls Use PersonPicture for user avatars Consistent avatar display with fallback initials PersonPicture with DisplayName and ProfilePicture Custom Ellipse with ImageBrush for avatars <PersonPicture DisplayName="Jane Doe" ProfilePicture="{x:Bind AvatarUri}"/> <Ellipse><Ellipse.Fill><ImageBrush ImageSource="avatar.png"/></Ellipse.Fill></Ellipse> Low https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/person-picture uwp legacy deprecated 2026-08-13
13 12 Styling Use ThemeResource for adaptive colors Colors that switch with light and dark theme ThemeResource for all color references Hardcoded hex values that break in dark mode Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}" Foreground="#000000" High https://learn.microsoft.com/en-us/windows/uwp/design/style/color uwp legacy deprecated 2026-08-13
14 13 Styling Use Fluent Design materials Acrylic translucent material for depth Built-in Fluent materials for depth and motion Custom shader effects for blur and reveal <Grid Background="{ThemeResource SystemControlAcrylicWindowBrush}"/> Custom CompositionEffectBrush recreating acrylic Medium https://learn.microsoft.com/en-us/windows/uwp/design/style/acrylic uwp legacy deprecated 2026-08-13
15 14 Styling Use Lightweight Styling Override control resource keys for subtle changes Lightweight styling resource overrides Full ControlTemplate copy for small tweaks <Button><Button.Resources><SolidColorBrush x:Key="ButtonBackground" Color="Blue"/></Button.Resources></Button> Entire ControlTemplate copied to change background Medium https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/xaml-styles#lightweight-styling uwp legacy deprecated 2026-08-13
16 15 Styling Use implicit styles for consistency TargetType without x:Key applies to all instances Implicit Style for default control appearance Repeating Setters on every control instance <Style TargetType="Button"><Setter Property="CornerRadius" Value="4"/></Style> CornerRadius="4" on every Button in the page Medium https://learn.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/xaml-styles uwp legacy deprecated 2026-08-13
17 16 Styling Use VisualStateManager for visual states Define visual states with Setters that change properties when triggered VisualStateGroup containing VisualStates with Setter targets Toggling Visibility from code-behind on SizeChanged <VisualStateGroup><VisualState x:Name="Wide"><VisualState.Setters><Setter Target="root.Orientation" Value="Horizontal"/></VisualState.Setters></VisualState></VisualStateGroup> SizeChanged handler that flips Orientation in code-behind High https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml uwp legacy deprecated 2026-08-13
18 17 Navigation Use Frame for page navigation Windows.UI.Xaml.Controls.Frame for UWP page navigation Frame.Navigate with typed parameters Swapping UserControls manually rootFrame.Navigate(typeof(DetailPage), itemId); contentArea.Content = new DetailPage(); Medium https://learn.microsoft.com/en-us/windows/uwp/design/basics/navigate-between-two-pages uwp legacy deprecated 2026-08-13
19 18 Navigation Handle back button correctly Provide an in-app Back button styled with NavigationBackButtonNormalStyle and handle SystemNavigationManager.BackRequested for hardware back gamepad B and Tablet-Mode back; also handle CoreDispatcher.AcceleratorKeyActivated for Alt+Left In-app NavigationBackButtonNormalStyle button plus SystemNavigationManager.BackRequested handler Relying on the deprecated title-bar back button (AppViewBackButtonVisibility) or ignoring system back signals SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested; No back button support on phone or tablet High https://learn.microsoft.com/en-us/windows/uwp/ui-input/back-navigation uwp legacy deprecated 2026-08-13
20 19 Navigation Support deep linking with protocol activation Respond to URI activation and toast taps OnActivated handler with proper page routing Ignoring activation arguments protected override void OnActivated(IActivatedEventArgs args) { if (args.Kind == ActivationKind.Protocol) { ... } } Empty OnActivated ignoring URI parameters Medium https://learn.microsoft.com/en-us/windows/uwp/launch-resume/handle-uri-activation uwp legacy deprecated 2026-08-13
21 20 Navigation Use ConnectedAnimations for continuity Smooth transitions between pages ConnectedAnimationService for shared element transitions Abrupt page transitions with no visual continuity ConnectedAnimationService.GetForCurrentView().PrepareToAnimate("image", sourceImage); No transition animation between list and detail Low https://learn.microsoft.com/en-us/windows/uwp/design/motion/connected-animation uwp legacy deprecated 2026-08-13
22 21 Data Binding Implement INotifyPropertyChanged Enable UI updates on property changes INotifyPropertyChanged on all ViewModels Auto-properties without notification public string Title { get => _title; set { _title = value; OnPropertyChanged(); } } public string Title { get; set; } expecting UI updates High https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth uwp legacy deprecated 2026-08-13
23 22 Data Binding Use ObservableCollection for lists Collection change notifications for ItemsSources ObservableCollection<T> for bound lists List<T> for data-bound collections ObservableCollection<Item> Items { get; } = new(); List<Item> Items { get; set; } = new(); High https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth uwp legacy deprecated 2026-08-13
24 23 Data Binding Use function bindings with x:Bind Call static methods directly in markup x:Bind to static converter methods IValueConverter for trivial transforms <TextBlock Visibility="{x:Bind local:Converters.BoolToVisibility(IsActive), Mode=OneWay}"/> Full IValueConverter class for bool to Visibility Medium https://learn.microsoft.com/en-us/windows/uwp/data-binding/function-bindings uwp legacy deprecated 2026-08-13
25 24 Data Binding Specify Mode on x:Bind x:Bind defaults to OneTime not OneWay Mode=OneWay or TwoWay when live updates needed Omitting Mode and getting stale UI Text="{x:Bind Title, Mode=OneWay}" Text="{x:Bind Title}" expecting live updates High https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension uwp legacy deprecated 2026-08-13
26 25 Data Binding Use CollectionViewSource for grouping Group and sort collections declaratively CollectionViewSource for grouped ListView and GridView Manual grouping logic in code-behind <CollectionViewSource x:Key="GroupedItems" IsSourceGrouped="True" Source="{x:Bind GroupedData}"/> Manual loop building grouped StackPanels Medium https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth uwp legacy deprecated 2026-08-13
27 26 Performance Use ListView and GridView virtualization Only creates containers for visible items Default virtualization in ListView and GridView Setting ItemsPanel to non-virtualizing panel <ListView ItemsSource="{x:Bind Items}"/> (virtualizes by default) <ListView><ListView.ItemsPanel><ItemsPanelTemplate><StackPanel/></ItemsPanelTemplate></ListView.ItemsPanel></ListView> High https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-gridview-and-listview uwp legacy deprecated 2026-08-13
28 27 Performance Use ISupportIncrementalLoading Load data on demand as user scrolls ISupportIncrementalLoading for large datasets Loading entire collection upfront class IncrementalSource : ObservableCollection<Item>, ISupportIncrementalLoading await LoadAll() loading 50K items at startup Medium https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth uwp legacy deprecated 2026-08-13
29 28 Performance Reduce XAML visual tree depth Simpler trees layout and render faster Flat templates with minimal nesting Deeply nested panels in DataTemplates <StackPanel><TextBlock/><TextBlock/></StackPanel> in item template <Grid><Border><StackPanel><Grid>... 8 levels in item template Medium https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/optimize-xaml-loading uwp legacy deprecated 2026-08-13
30 29 Performance Use compiled bindings in DataTemplates x:Bind in templates requires x:DataType x:DataType on DataTemplate for compiled bindings {Binding} in item templates for large lists <DataTemplate x:DataType="local:Item"><TextBlock Text="{x:Bind Name}"/></DataTemplate> <DataTemplate><TextBlock Text="{Binding Name}"/></DataTemplate> High https://learn.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension uwp legacy deprecated 2026-08-13
31 30 Performance Profile with Visual Studio diagnostics Measure before optimizing Application Timeline and Memory Usage tools Guessing at performance problems VS Diagnostic Tools > Application Timeline Optimizing without profiling data Medium https://learn.microsoft.com/en-us/visualstudio/profiling/application-timeline uwp legacy deprecated 2026-08-13
32 31 Threading Use async/await for all IO Keep UI thread responsive async/await for file network and database operations Synchronous IO blocking the UI thread var file = await StorageFile.GetFileFromPathAsync(path); StorageFile.GetFileFromPathAsync(path).AsTask().Result; High https://learn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform-apps uwp legacy deprecated 2026-08-13
33 32 Threading Use CoreDispatcher for UI thread access Post work back to the UI thread from background Dispatcher.RunAsync from background threads Touching UI elements from background threads await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Status = "Done"); textBlock.Text = "Done" from Task.Run High https://learn.microsoft.com/en-us/uwp/api/windows.ui.core.coredispatcher uwp legacy deprecated 2026-08-13
34 33 Threading Offload CPU work with Task.Run Keep compute-heavy work off UI thread Task.Run for CPU-bound operations Heavy computation blocking UI var result = await Task.Run(() => ProcessData(items)); var result = ProcessData(items); freezing UI High https://learn.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-universal-windows-platform-apps uwp legacy deprecated 2026-08-13
35 34 Threading Use IProgress for status updates Report progress from background operations IProgress<T> for progress reporting to UI Polling shared variables for progress var progress = new Progress<int>(p => ProgressBar.Value = p); await Task.Run(() => Process(progress)); while (!done) { await Task.Delay(100); check shared field; } Medium https://learn.microsoft.com/en-us/dotnet/api/system.progress-1 uwp legacy deprecated 2026-08-13
36 35 Adaptive Use AdaptiveTrigger for responsive layouts MinWindowWidth and MinWindowHeight triggers fire at standard breakpoints (640 small / 1008 medium) AdaptiveTrigger inside VisualState.StateTriggers with the 640 and 1008 breakpoints Fixed layouts for a single screen size <VisualState.StateTriggers><AdaptiveTrigger MinWindowWidth="640"/></VisualState.StateTriggers> Single-column layout at all widths High https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml uwp legacy deprecated 2026-08-13
37 36 Adaptive Design for multiple device families Phone tablet desktop Xbox and HoloLens DeviceFamily-specific views and resources Desktop-only design ignoring other form factors DeviceFamily-Mobile/MainPage.xaml for phone-specific layout Fixed 1920x1080 layout Medium https://learn.microsoft.com/en-us/windows/uwp/design/layout/screen-sizes-and-breakpoints-for-responsive-design uwp legacy deprecated 2026-08-13
38 37 Adaptive Use RelativePanel for adaptive positioning Controls position relative to each other RelativePanel for layouts that reflow at breakpoints Absolute positioning or fixed margins <Button RelativePanel.Below="title" RelativePanel.AlignLeftWithPanel="True"/> <Button Margin="0,60,0,0"/> calculated from title height Medium https://learn.microsoft.com/en-us/windows/uwp/design/layout/layouts-with-xaml#relativepanel uwp legacy deprecated 2026-08-13
39 38 Adaptive Support multi-window with secondary views Open detached views with CoreApplication.CreateNewView and ApplicationViewSwitcher CreateNewView and TryShowAsStandaloneAsync for multi-document scenarios Single-window assumptions when scenarios benefit from secondary views var view = CoreApplication.CreateNewView(); await view.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { /* set content */ }); Modal overlay used for content that should be a separate window Medium https://learn.microsoft.com/en-us/windows/uwp/design/layout/show-multiple-views uwp legacy deprecated 2026-08-13
40 39 Accessibility Set AutomationProperties Enable Narrator and screen reader support AutomationProperties.Name on all interactive controls Controls without accessible names <AppBarButton AutomationProperties.Name="Save document" Icon="Save"/> <AppBarButton Icon="Save"/> without name High https://learn.microsoft.com/en-us/windows/uwp/design/accessibility/basic-accessibility-information uwp legacy deprecated 2026-08-13
41 40 Accessibility Support keyboard and gamepad All functions reachable without touch Tab navigation XYFocus and access keys Touch-only interactions <Button AccessKey="S" XYFocusDown="{x:Bind OtherButton}"/> No keyboard or gamepad support High https://learn.microsoft.com/en-us/windows/uwp/design/input/keyboard-interactions uwp legacy deprecated 2026-08-13
42 41 Accessibility Support contrast themes Respect system contrast themes (renamed from high contrast in Windows 11) ThemeResource brushes that adapt to contrast themes Hardcoded colors that vanish under contrast themes Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}" Foreground="#444444" High https://learn.microsoft.com/en-us/windows/uwp/design/accessibility/high-contrast-themes uwp legacy deprecated 2026-08-13
43 42 Accessibility Test with Narrator and Accessibility Insights Validate screen reader and automation compliance Regular Narrator walkthrough and Accessibility Insights scan Shipping without accessibility testing Accessibility Insights FastPass on every page No accessibility testing before release Medium https://accessibilityinsights.io/ uwp legacy deprecated 2026-08-13
44 43 Architecture Use MVVM pattern Separate View ViewModel and Model ViewModel with INotifyPropertyChanged and ICommand Business logic in code-behind ViewModel bound via DataContext with commands MainPage.xaml.cs with database calls and UI logic Medium https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-and-mvvm uwp legacy deprecated 2026-08-13
45 44 Architecture Use Template Studio for scaffolding Proven project templates with navigation and services Windows Template Studio for new UWP projects Blank project with manual boilerplate Template Studio with MVVM Toolkit and navigation service Blank App template building everything from scratch Low https://github.com/microsoft/TemplateStudio uwp legacy deprecated 2026-08-13
46 45 Architecture Use dependency injection Register services for testability Microsoft.Extensions.DI for service resolution Static singletons and manual construction services.AddTransient<MainViewModel>(); services.AddSingleton<IDataService, DataService>(); DataService.Instance or new DataService() everywhere Medium https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection uwp legacy deprecated 2026-08-13
47 46 Architecture Keep platform APIs behind abstractions Isolate WinRT APIs from business logic Interfaces wrapping StorageFile FilePicker etc Direct WinRT calls in ViewModels IFileService wrapping FileOpenPicker and StorageFile FileOpenPicker usage directly in ViewModel Medium https://learn.microsoft.com/en-us/windows/uwp/data-binding/data-binding-and-mvvm uwp legacy deprecated 2026-08-13
48 47 Lifecycle Handle suspend and resume UWP apps are suspended when not in foreground Save state in OnSuspending and restore in OnLaunched Ignoring app lifecycle losing user state Application.Current.Suspending += (s, e) => SaveState(); No suspend handler losing in-progress form data High https://learn.microsoft.com/en-us/windows/uwp/launch-resume/app-lifecycle uwp legacy deprecated 2026-08-13
49 48 Lifecycle Use ExtendedExecutionSession for background work Request extended time for unfinished operations ExtendedExecutionSession for saving or uploads Assuming background work completes after suspend var session = new ExtendedExecutionSession { Reason = ExtendedExecutionReason.SavingData }; Long upload with no extended execution that gets killed on suspend Medium https://learn.microsoft.com/en-us/windows/uwp/launch-resume/run-minimized-with-extended-execution uwp legacy deprecated 2026-08-13
50 49 Lifecycle Handle prelaunch Apps must opt in to prelaunch via CoreApplication.EnablePrelaunch(true) starting in Windows 10 1607; check LaunchActivatedEventArgs.PrelaunchActivated to skip user-visible work Opt in with EnablePrelaunch and skip heavy init when PrelaunchActivated is true Performing full initialization or navigating during prelaunch CoreApplication.EnablePrelaunch(true); if (e.PrelaunchActivated) return; // skip heavy init Loading all data and navigating on prelaunch Medium https://learn.microsoft.com/en-us/windows/uwp/launch-resume/handle-app-prelaunch uwp legacy deprecated 2026-08-13
51 50 Testing Unit test ViewModels Test logic without UI framework dependencies xUnit or MSTest on ViewModel methods Testing only through the running app [Fact] public async Task Load_PopulatesItems() { await vm.LoadAsync(); Assert.NotEmpty(vm.Items); } Manual testing by tapping through the app Medium https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices uwp legacy deprecated 2026-08-13
52 51 Testing Use WinAppDriver with Appium for UI tests Automated UI testing for UWP (Coded UI Test was deprecated in Visual Studio 2019); WinAppDriver v1 is in low-maintenance mode and Appium 2 is the modern direction WinAppDriver with Appium for end-to-end tests Manual regression testing session.FindElementByAccessibilityId("SaveButton").Click(); Manual click-through testing before each release Medium https://github.com/microsoft/WinAppDriver uwp legacy deprecated 2026-08-13
53 52 Testing Test on multiple device families Behavior varies across phone desktop and Xbox Test on device emulators and real hardware Desktop-only testing Test on Mobile emulator and Xbox dev mode Only running on local desktop Medium https://learn.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal uwp legacy deprecated 2026-08-13
54 53 Architecture Prefer WinUI 3 for new projects UWP is in maintenance mode and Microsoft recommends WinUI 3 and Windows App SDK for new development UWP is maintenance-only; WinUI 3 with the Windows App SDK is the recommended path for new Windows apps WinUI 3 with Windows App SDK for new desktop apps Use WinUI 3 with the Windows App SDK for every new Windows app Starting new projects on UWP when WinUI 3 is available Start a new Windows app on UWP New project with Microsoft.WindowsAppSDK and WinUI 3 New UWP project for a desktop-only app in 2024+ New UWP project for a Windows app Medium https://learn.microsoft.com/en-us/windows/apps/get-started/ uwp legacy deprecated 2026-08-13
55 54 Architecture Plan migration to Windows App SDK Microsoft provides migration guides from UWP to WinUI 3 Maintain existing UWP apps while planning migration to WinUI 3 and the Windows App SDK; do not expand UWP as the foundation for new Windows development Incremental migration using XAML Islands or full port to WinUI 3 Use the UWP migration guidance to plan an incremental migration or full port to WinUI 3 Ignoring migration path and accumulating UWP technical debt Continue major new-app investment on UWP without a Windows App SDK migration plan Follow UWP to WinUI 3 migration guide for existing apps Follow the UWP to WinUI 3 migration guide for existing apps Continuing major feature development on UWP without migration plan Start a new Windows app on UWP instead of WinUI 3 Medium https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/overall-migration-strategy uwp legacy deprecated 2026-08-13
56 55 Lifecycle Use a deferral when saving async state on suspend Suspending grants only ~5 seconds before the OS may terminate; await work needs SuspendingOperation.GetDeferral and Complete or save returns before it finishes GetDeferral around async save calls and Complete in finally Async work that returns the suspending handler before completion async void OnSuspending(object s, SuspendingEventArgs e) { var d = e.SuspendingOperation.GetDeferral(); try { await SaveAsync(); } finally { d.Complete(); } } async void OnSuspending(object s, SuspendingEventArgs e) { await SaveAsync(); } // handler returns before save completes Medium https://learn.microsoft.com/en-us/windows/uwp/launch-resume/app-lifecycle uwp legacy deprecated 2026-08-13