mirror of
https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git
synced 2026-07-14 02:22:06 +08:00
Adds WPF, WinUI 3, UWP, Avalonia, and Uno Platform stacks (17 -> 22 total), each with its own guidelines CSV, registered in core.py and synced to cli/assets. - New stack CSVs in src/ and cli/assets/data/stacks/ - search.py / core.py registry updated - smoke-stacks.sh: EXPECTED_STACK_COUNT 21 -> 22 with a smoke-test workflow - platform template descriptions and README bumped to 22 technology stacks
22 KiB
22 KiB
| 1 | No | Category | Guideline | Description | Do | Don't | Code Good | Code Bad | Severity | Docs URL |
|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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/ |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 | 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/ |
| 55 | 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 |
| 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 |