From 1911908419e6964cc5aba4e6c6576a02e32c3f53 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 19:50:49 +0800 Subject: [PATCH] Fix accessibility: Associate controls with labels for screen readers (#42439) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem Input controls (ComboBoxes, ToggleSwitches, NumberBoxes) within SettingsCards throughout the PowerToys Settings UI were not programmatically associated with their visible labels. This caused screen readers to announce only the control type (e.g., "combo box", "toggle switch") without any context about the control's purpose, making the settings inaccessible to screen reader users. This violates WCAG 2.2 Success Criterion 1.3.1 (Info and Relationships) - Level A requirement. **User Impact**: Screen reader users navigating PowerToys settings would hear only "edit text" or "combo box" with no description, making it difficult or impossible to configure settings independently. ## Solution Added `AutomationProperties.Name` bindings to controls, linking them to their parent SettingsCard's `Header` property. This establishes the programmatic relationship between labels and controls required by assistive technologies. ### Pattern Applied For controls inside SettingsCards with a `Name` attribute: ```xaml ``` For data templates where headers are data-bound: ```xaml ``` ## Changes Made ### GeneralPage.xaml (7 controls) - Language selection ComboBox - Color mode/theme ComboBox - Run at startup ToggleSwitch - Show system tray icon ToggleSwitch - Enable experimentation ToggleSwitch - Enable data diagnostics ToggleSwitch - Enable view diagnostic data ToggleSwitch ### PowerLauncherPage.xaml (4 data templates) - ComboBoxTemplate - for plugin settings - NumberBoxTemplate - for plugin numeric settings - CheckBoxComboBoxTemplate - for conditional ComboBox settings - CheckBoxNumberBoxTemplate - for conditional NumberBox settings ### PowerRenamePage.xaml (6 controls) - Enable PowerRename ToggleSwitch - Context menu mode ComboBox - Enable auto-complete ToggleSwitch - Max display list number NumberBox - Restore flags on launch ToggleSwitch - Use Boost library ToggleSwitch ### NewPlusPage.xaml (4 controls) - Enable New+ ToggleSwitch - Hide file extension ToggleSwitch - Hide starting digits ToggleSwitch - Replace variables ToggleSwitch ## Testing Screen readers (Windows Narrator) now properly announce controls with context: - **Before**: "Combo box" - **After**: "Language, Combo box" No functional changes to application behavior. The fix only affects how controls are announced to assistive technologies. ## Notes This fix follows the existing pattern already used in ColorPickerPage.xaml. Similar issues exist in approximately 23 other Settings pages which can be addressed in future PRs using this established pattern. The pages fixed in this PR represent commonly-accessed settings and demonstrate the solution approach for comprehensive coverage. Closes # ## References - WCAG 2.2 SC 1.3.1: https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships - UIA Name Property: https://learn.microsoft.com/en-us/windows/apps/design/accessibility/accessible-text-requirements#name_property_alternative_and_description
Original prompt > > ---- > > *This section details on the original issue you should resolve* > > Controls Inside Sections Are Not Associated with Their Labels. > ### Microsoft PowerToys version > > v0.94.2 > > ### Installation method > > PowerToys auto-update > > ### Area(s) with issue? > > New+ > > ### Steps to reproduce > > **Repro Steps:** > > 1. Open the Power Toys. > 2. Now navigate to the home present in the left navigation pane. > 3. Now turn on the narrator using CTRL + Win + Enter. > 4. Now navigate to the controls present inside the different sections. > 5. Observe the issue. > > ### ✔️ Expected Behavior > > Each control should be programmatically associated with its corresponding label so screen readers can accurately convey the purpose of the control to users. > > ### ❌ Actual Behavior > > Input controls (e.g., checkboxes, text fields, dropdowns) located within different sections of the UI are not programmatically associated with their visible labels. > > ### Additional Information > > **User Impact:** > Screen reader users may hear only the control type (e.g., “edit text”) with no context or description of what it is for. This makes it difficult or impossible for them to fill out forms or interact with the UI correctly, leading to confusion and frustration. > > **WCAG Reference:** > https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships > > **Attachments:** > > https://github.com/user-attachments/assets/d25b9237-bee7-41d5-b564-df15df19b0d4 > > ### Other Software > > _No response_ > > ## Comments on the Issue (you are @copilot in this section) > > > >
Fixes microsoft/PowerToys#42419 --- ✨ Let Copilot coding agent [set things up for you](https://github.com/microsoft/PowerToys/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: niels9001 <9866362+niels9001@users.noreply.github.com> Co-authored-by: Gordon Lam (SH) --- .../SettingsXAML/Views/GeneralPage.xaml | 35 +++++++++++++++---- .../SettingsXAML/Views/NewPlusPage.xaml | 20 ++++++++--- .../SettingsXAML/Views/PowerLauncherPage.xaml | 4 +++ .../SettingsXAML/Views/PowerRenamePage.xaml | 26 +++++++++++--- 4 files changed, 69 insertions(+), 16 deletions(-) diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Views/GeneralPage.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Views/GeneralPage.xaml index fcdcc0f60d..cf67586a3e 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Views/GeneralPage.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/Views/GeneralPage.xaml @@ -240,6 +240,7 @@ @@ -262,7 +263,10 @@ - + @@ -273,12 +277,16 @@ Name="GeneralPageRunAtStartUp" x:Uid="GeneralPage_RunAtStartUp" IsEnabled="{x:Bind ViewModel.IsRunAtStartupGPOManaged, Mode=OneWay, Converter={StaticResource BoolNegationConverter}}"> - + - + @@ -398,12 +406,16 @@ - + - + - - + + - + @@ -60,12 +63,18 @@ Name="NewPlusHideFileExtensionToggle" x:Uid="NewPlus_Hide_File_Extension_Toggle" IsEnabled="{x:Bind ViewModel.IsHideFileExtSettingsCardEnabled, Mode=OneWay}"> - + - + @@ -79,7 +88,10 @@ x:Uid="NewPlus_Behaviour_Replace_Variables_Toggle" IsEnabled="{x:Bind ViewModel.IsReplaceVariablesSettingsCardEnabled, Mode=OneWay}"> - +