doc/articles/features/accessibility/index.md
[!TIP] This article covers Uno-specific information for accessibility support. For a full description of the WinUI accessibility model and design guidelines, see Accessibility overview.
Uno Platform implements the WinUI UI Automation framework to make your applications accessible to screen readers and other assistive technologies. The same AutomationProperties and AutomationPeer APIs you use on WinUI work across all Uno Platform targets — each platform maps them to its native accessibility layer.
| Platform | Rendering | Assistive Technology | Status |
|---|---|---|---|
| Windows (Win32) | Skia | Narrator (via UIAutomation) | ✔ |
| macOS | Skia | VoiceOver | ✔ |
| Web (WASM) | Skia | Any screen reader (via ARIA) | ✔ |
| Linux | Skia | — | Planned |
| Android | Skia | TalkBack | WIP |
| iOS | Skia | VoiceOver | WIP |
| Android | Native | TalkBack | ✔ |
| iOS | Native | VoiceOver | ✔ |
| Web (WASM) | Native | Any screen reader (via ARIA) | ✔ |
[!NOTE] This documentation focuses primarily on the Skia rendering accessibility implementation. Native rendering on Android, iOS, and WASM maps
AutomationPropertiesdirectly to the platform's native accessibility APIs (e.g.,contentDescriptionon Android,accessibilityLabelon iOS,aria-labelon WASM).
On Skia-rendered targets, Uno maintains a semantic accessibility tree alongside the visual tree. When you set properties such as AutomationProperties.Name or AutomationProperties.HeadingLevel, the corresponding automation peer publishes that information to the platform's assistive technology:
NSAccessibility elements so VoiceOver can navigate the application.[!NOTE] On WASM, the accessibility layer activates when the user first presses the
Tabkey. An "Enable accessibility" button appears that must be activated (clicked or viaSpace) before the full semantic tree is available. This is done to avoid performance overhead when accessibility is not needed.
To make your Uno app accessible, follow the same patterns you would use on WinUI:
AutomationProperties.Name or AutomationProperties.LabeledBy.AutomationProperties.HeadingLevel) so screen reader users can navigate the page structure.AutomationProperties.LandmarkType) to identify major regions of the UI.AutomationProperties.LiveSetting for live regions.<Page xmlns:auto="using:Microsoft.UI.Xaml.Automation">
<StackPanel auto:AutomationProperties.LandmarkType="Main">
<TextBlock Text="Settings"
auto:AutomationProperties.HeadingLevel="Level1" />
<TextBox auto:AutomationProperties.Name="Display name"
auto:AutomationProperties.HelpText="Enter the name shown on your profile" />
<Button Content="Save"
auto:AutomationProperties.Name="Save settings" />
</StackPanel>
</Page>
| Topic | Description |
|---|---|
| AutomationProperties reference | Supported AutomationProperties with per-platform mappings |
| Custom automation peers | Skia accessibility architecture and ARIA role mappings |
| Role override | Uno-specific AutomationPropertiesExtensions.Role attached property for explicit ARIA role control |
| Testing with screen readers | WASM activation, SamplesApp testing, and debugging the accessibility tree |
Some libraries depend on AccessibilitySettings to check for high contrast. On Uno targets, the properties return defaults unless overridden:
var settings = new AccessibilitySettings();
settings.HighContrast; // default: false
settings.HighContrastScheme; // default: "High Contrast Black"
// Override the defaults
WinRTFeatureConfiguration.Accessibility.HighContrast = true;
WinRTFeatureConfiguration.Accessibility.HighContrastScheme = "High Contrast White";
When WinRTFeatureConfiguration.Accessibility.HighContrast changes, the AccessibilitySettings.HighContrastChanged event is raised.
On iOS and Android with native rendering, the OS provides accessibility text scaling. To opt out:
Uno.UI.FeatureConfiguration.Font.IgnoreTextScaleFactor = true;
[!NOTE] On Skia targets, text scaling is handled by the OS or browser zoom level and is not controlled by this property.
[!IMPORTANT] This applies only to iOS and Android native rendering. It is not used on Skia targets.
On iOS, VoiceOver reads all inner accessible names of a list item concatenated but does not let the user focus individual children. SimpleAccessibility mode brings this behavior to Android for consistency:
#if __IOS__ || __ANDROID__
FeatureConfiguration.AutomationPeer.UseSimpleAccessibility = true;
#endif