Fix VoiceOver doesnot announces the State of the ComboBox #32286
Fix VoiceOver doesnot announces the State of the ComboBox #32286PureWeen merged 2 commits intodotnet:inflight/currentfrom
Conversation
| { | ||
| if (value) | ||
| { | ||
| SemanticScreenReader.Announce("State Expanded"); |
There was a problem hiding this comment.
The current announcements "State Expanded" and "State Collapsed" lack context about what was expanded/collapsed.
There was a problem hiding this comment.
Hi @jsuarezruiz,I’ve updated the SemanticScreenReader with the responsible category. Please review the changes and let me know if you have any feedback or concerns.
src/Templates/src/templates/maui-mobile/PageModels/ProjectDetailPageModel.cs
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Pull Request Overview
This PR improves accessibility for Picker controls in the MAUI mobile template by implementing dynamic screen reader announcements for picker state changes. Instead of using static semantic properties, the changes track picker expansion state through bound properties and announce state changes programmatically.
Key changes:
- Replaced static SemanticProperties attributes with programmatic SemanticScreenReader.Announce calls
- Added IsOpen bindings to Picker controls to track their expanded/collapsed state
- Implemented property change handlers to announce picker state changes to screen readers
Reviewed Changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| TaskDetailPage.xaml | Updated Project picker with consolidated semantic description and IsOpen binding; removed redundant semantic properties |
| ProjectDetailPage.xaml | Updated Category picker with consolidated semantic description and IsOpen binding; removed redundant semantic properties |
| TaskDetailPageModel.cs | Added IsProjectPickerExpanded property and OnIsProjectPickerExpandedChanged handler to announce picker state changes |
| ProjectDetailPageModel.cs | Added IsCategoryPickerExpanded property and OnIsCategoryPickerExpandedChanged handler to announce picker state changes |
| OnPropertyChanged(nameof(HasCompletedTasks)); | ||
| } | ||
|
|
||
| partial void OnIsCategoryPickerExpandedChanged(bool value) |
There was a problem hiding this comment.
Extra space between 'void' and 'OnIsCategoryPickerExpandedChanged'. Should be single space for consistency with the similar method in TaskDetailPageModel.cs.
|
/azp run |
|
Azure Pipelines successfully started running 1 pipeline(s). |
src/Templates/src/templates/maui-mobile/PageModels/TaskDetailPageModel.cs
Show resolved
Hide resolved
58eef7e to
8c8402b
Compare
### Issue Description: VoiceOver does not read the ComboBox State correctly, In the sample, the ComboBox behavior is implemented using SfTextInputLayout with a Picker. However, I have already implemented the semantic properties for picker , it was overriden by SfTextInputLayout, the expectation is for VoiceOver to recognise and announce it as a ComboBox state. ### Description of change : Update SemanticProperties using property changed on IsOpen property in picker to achieve the expected output. > Note: net9.0 PR - dotnet/maui-samples#651 ### Issues Fixed Fixes [#30899 ](#30899) ### Tested the behaviour in the following platforms - [ ] Android - [ ] Windows - [ ] iOS - [x] Mac
### Issue Description: VoiceOver does not read the ComboBox State correctly, In the sample, the ComboBox behavior is implemented using SfTextInputLayout with a Picker. However, I have already implemented the semantic properties for picker , it was overriden by SfTextInputLayout, the expectation is for VoiceOver to recognise and announce it as a ComboBox state. ### Description of change : Update SemanticProperties using property changed on IsOpen property in picker to achieve the expected output. > Note: net9.0 PR - dotnet/maui-samples#651 ### Issues Fixed Fixes [#30899 ](#30899) ### Tested the behaviour in the following platforms - [ ] Android - [ ] Windows - [ ] iOS - [x] Mac
### Issue Description: VoiceOver does not read the ComboBox State correctly, In the sample, the ComboBox behavior is implemented using SfTextInputLayout with a Picker. However, I have already implemented the semantic properties for picker , it was overriden by SfTextInputLayout, the expectation is for VoiceOver to recognise and announce it as a ComboBox state. ### Description of change : Update SemanticProperties using property changed on IsOpen property in picker to achieve the expected output. > Note: net9.0 PR - dotnet/maui-samples#651 ### Issues Fixed Fixes [#30899 ](#30899) ### Tested the behaviour in the following platforms - [ ] Android - [ ] Windows - [ ] iOS - [x] Mac
### Issue Description: VoiceOver does not read the ComboBox State correctly, In the sample, the ComboBox behavior is implemented using SfTextInputLayout with a Picker. However, I have already implemented the semantic properties for picker , it was overriden by SfTextInputLayout, the expectation is for VoiceOver to recognise and announce it as a ComboBox state. ### Description of change : Update SemanticProperties using property changed on IsOpen property in picker to achieve the expected output. > Note: net9.0 PR - dotnet/maui-samples#651 ### Issues Fixed Fixes [#30899 ](#30899) ### Tested the behaviour in the following platforms - [ ] Android - [ ] Windows - [ ] iOS - [x] Mac
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 16 commits with various improvements, bug fixes, and enhancements. ## Checkbox - [Android] Implement material3 support for CheckBox by @HarishwaranVijayakumar in #33339 <details> <summary>🔧 Fixes</summary> - [Implement Material3 Support for CheckBox](#33338) </details> ## CollectionView - [Android] Fixed EmptyView doesn’t display when CollectionView is placed inside a VerticalStackLayout by @NanthiniMahalingam in #33134 <details> <summary>🔧 Fixes</summary> - [CollectionView does not show an EmptyView template with an empty collection](#32932) </details> ## Essentials - [Windows]Fix NullReferenceException in OpenReadAsync for FileResult created with full path by @devanathan-vaithiyanathan in #28238 <details> <summary>🔧 Fixes</summary> - [[Windows] FileResult(string fullPath) not initialized properly](#26858) </details> ## Image - Fix Glide IllegalArgumentException in MauiCustomTarget.clear() for destroyed activities by @jfversluis via @Copilot in #29780 <details> <summary>🔧 Fixes</summary> - [java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity - glide](#29699) </details> ## Label - [Android] Fix for Label WordWrap width issue causing HorizontalOptions misalignment by @praveenkumarkarunanithi in #33281 <details> <summary>🔧 Fixes</summary> - [[Android] Unexpected Line Breaks in Android, Label with WordWrap Mode Due to Trailing Space.](#31782) - [Label not sized correctly on Android](#27614) </details> - Fix to Improve Flyout Accessibility by Adjusting UITableViewController Labels by @SuthiYuvaraj in #31619 <details> <summary>🔧 Fixes</summary> - [Navigation section present under hamburger are programmatically define as table :A11y_.NET maui_User can get all the insights of Dashboard_Devtools](#30894) </details> ## Mediapicker - [Regression][iOS] Fix MediaPicker PickPhotosAsync getting file name in contentType property by @devanathan-vaithiyanathan in #33390 <details> <summary>🔧 Fixes</summary> - [[iOS] MediaPicker PickPhotosAsync getting file name in contentType property](#33348) </details> ## Navigation - Fix handler not disconnected when removing non visible pages using RemovePage() by @Vignesh-SF3580 in #32289 <details> <summary>🔧 Fixes</summary> - [NavigationPage.Navigation.RemovePage() fails to disconnect handlers when removing pages, unlike ContentPage.Navigation.RemovePage()](#32239) </details> ## Picker - [Android] Fix Picker IsOpen not reset when picker is dismissed by @devanathan-vaithiyanathan in #33332 <details> <summary>🔧 Fixes</summary> - [[Android] Picker IsOpen not reset when picker is dismissed](#33331) </details> ## Shell - [iOS & Catalyst ] Fixed IsEnabled property should work on Tabs by @SubhikshaSf4851 in #33369 <details> <summary>🔧 Fixes</summary> - [[Catalyst] TabBarBackgroundColor, TabBarUnselectedColor, and IsEnabled Not Working as Expected in Shell](#33158) </details> - [iOS,Windows] Fix navigation bar colors not resetting when switching ShellContent by @Vignesh-SF3580 in #33228 <details> <summary>🔧 Fixes</summary> - [[iOS, Windows] Shell Navigation bar colors are not updated correctly when switching ShellContent](#33227) </details> - [iOS] Fixed Shell navigation on search handler suggestion selection by @SubhikshaSf4851 in #33406 <details> <summary>🔧 Fixes</summary> - [[iOS] Clicking on search suggestions fails to navigate to detail page correctly](#33356) </details> ## Templates - Fix VoiceOver doesnot announces the State of the ComboBox by @SuthiYuvaraj in #32286 ## Xaml - [XSG][BindingSourceGen] Add support for CommunityToolkit.Mvvm ObservablePropertyAttribute by @simonrozsival via @Copilot in #33028 <details> <summary>🔧 Fixes</summary> - [[XSG] Add heuristic to support bindable properties generated by other source generators](#32597) </details> <details> <summary>📦 Other (2)</summary> - [XSG] Improve diagnostic reporting during binding compilation by @simonrozsival via @Copilot in #32905 - [Testing] Fixed Test case failure in PR 33574 - [01/19/2026] Candidate - 1 by @TamilarasanSF4853 in #33602 </details> **Full Changelog**: main...inflight/candidate
Issue Description:
VoiceOver does not read the ComboBox State correctly, In the sample, the ComboBox behavior is implemented using SfTextInputLayout with a Picker. However, I have already implemented the semantic properties for picker , it was overriden by SfTextInputLayout, the expectation is for VoiceOver to recognise and announce it as a ComboBox state.
Description of change :
Update SemanticProperties using property changed on IsOpen property in picker to achieve the expected output.
Issues Fixed
Fixes #30899
Tested the behaviour in the following platforms