[Windows] Fix Flyout/Locked mode header collapse regression causing UI test failures on candidate branch#35312
Conversation
…Mode to prevent header collapse regression in FlyoutPage/Locked mode.
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 4 findings
See inline comments for details.
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 3 findings
See inline comments for details.
…I test failures on candidate branch (#35340) <!-- Please let the below note in for people that find this PR --> > [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! Recreates #35312, which was accidentally merged into `inflight/candidate` instead of `inflight/current`. The candidate-side merge was reverted by #35339; this PR re-targets the same fix to `inflight/current`. Original author: @BagavathiPerumal --- ### Root cause PR #30382 introduced AlwaysShowHeader = false in the RootNavigationView constructor to fix Issue #30254 (blank header space in the Shell flyout). However, this was applied unconditionally across all NavigationView display modes. In the scenario from Issue2740 (FlyoutPage with FlyoutBehavior.Locked), the PaneDisplayMode is Left, not LeftMinimal. Because AlwaysShowHeader was set to false, WinUI's NavigationView collapsed the header whenever the Header became temporarily null during page transitions. As a result, toolbar items (e.g., the Switch button) were removed from the UI Automation tree, causing the test to fail. ### Description of Change The fix updates AlwaysShowHeader dynamically based on the current PaneDisplayMode within the PaneDisplayModeChanged handler: AlwaysShowHeader = PaneDisplayMode != NavigationViewPaneDisplayMode.LeftMinimal; This ensures: - AlwaysShowHeader = false only for LeftMinimal mode (Shell Flyout), preserving the fix for Issue #30254. - AlwaysShowHeader = true for all other modes (e.g., Left / FlyoutBehavior.Locked), ensuring the header remains visible and toolbar items stay accessible in the UI Automation tree. Also added the updated snapshot for the #30382. ### Issues Fixed - Regression introduced by PR #30382 ### Resaved Test snapshots The below-mentioned test case was resaved because the ContentPage did not have a title. Based on the fix, the currently generated image is the expected image, so the test snapshot has been resaved accordingly, similar to [#30382](#30382). - ModalPageBackgroundShouldBeTransparent **Added snapshots:** Additionally, the updated snapshot for [#30382](#30382) has also been added for the Mac and Windows platforms. - ShouldHideHeaderWhenTitleEmpty - ShouldShowHeaderWhenTitleNotEmpty ### Failure test cases - VerifyFlyoutVerticalScrollModeDisabled - VerifyFlyoutPageToolbarItemsRender - ShouldFlyoutBeVisibleAfterMaximizingWindow - FlyoutItemTextShouldDisplayProperly - VerifyShellMenuItemsAlignedInRTL - TestB43527UpdateTitle - TitleUpdatesAfterShowingNonFlyoutPage - WhenFlyoutIsLockedButtonsAreStillVisible - Issue2740Test - NavigationPageTitle - DoNotAccessDisposedCollectionView Co-authored-by: BagavathiPerumal <93652794+BagavathiPerumal@users.noreply.github.com>
🤖 AI Summary
📊 Review Session —
|
| Category | Result | Tests | Duration | Notes |
|---|---|---|---|---|
ViewBaseTests |
❌ FAILED | 104/115 (11 ❌) | 1235.5s | exit code 1, names truncated |
Show 4 of 104 passed test name(s) — stdout was truncated, full list in build log
ViewBaseTests
VisualTransform_ScaleXWithShadow(5 s)VisualTransform_ScaleY(4 s)VisualTransform_ScaleYWithAnchorXAndRotationY(6 s)VisualTransform_ScaleYWithShadow(5 s)
Failures here are informational only — they do not block the gate or affect try-fix candidate scoring.
ℹ️ This section was reconstructed from the build artifact (35312 build) after the run completed.
🔍 Regression Cross-Reference
🔍 Regression Cross-Reference
🟢 No regression risks detected. No labeled bug-fix PRs in the last 6 months touched the modified files.
🔍 Pre-Flight — Context & Validation
Pre-Flight: PR #35312
PR metadata
- Title: [Windows] Fix Flyout/Locked mode header collapse regression causing UI test failures on candidate branch
- Author: BagavathiPerumal
- Base:
dotnet/maui:inflight/candidate@faf4d2f9 - Head:
BagavathiPerumal/maui:fix-30254-regression@8e544f16 - Status: MERGED (2026-05-07) — milestone
.NET 10 SR7 - Labels: platform/windows, area-controls-shell, area-testing, s/agent-reviewed, s/agent-changes-requested, s/agent-fix-pr-picked
- Size: 11 additions / 0 deletions across 6 files (1 code file + 5 snapshot PNGs)
Problem statement
PR #30382 fixed Issue #30254 (blank header space in the Shell flyout) by setting
AlwaysShowHeader = false unconditionally in the RootNavigationView constructor.
However, that change applies across all WinUI NavigationView PaneDisplayMode
values, not just LeftMinimal (the mode used by Shell flyout).
In FlyoutPage with FlyoutBehavior.Locked (PaneDisplayMode = Left), WinUI
collapses the header whenever the bound Header property becomes temporarily
null during a page transition. With AlwaysShowHeader=false, the collapse
happens; without ever re-expanding when Header is set again, leaving toolbar
items (e.g., a Switch button used by Issue 2740 tests) absent from the UI
Automation tree. This caused a chain of regressions across many UI tests
(VerifyFlyoutPageToolbarItemsRender, Issue2740Test, WhenFlyoutIsLockedButtonsAreStillVisible,
NavigationPageTitle, etc.).
The fix
Single line added to PaneDisplayModeChanged:
AlwaysShowHeader = PaneDisplayMode != NavigationViewPaneDisplayMode.LeftMinimal;Plus an extensive comment block documenting why each mode is safe:
LeftMinimal(Shell flyout) → keepfalsesoCollapseEmptyHeader()works.Left(Locked FlyoutPage) →true, restoring pre-[Windows] Fix for Shell.FlyoutBehavior="Flyout" forces the title height space above the tab bar even if the page title is empty #30382 behavior.Top(TabbedPage) →trueis safe becauseUpdateToolbarPlacementsets
Header = null, andUpdateHeaderPropertyBindingbindsHeaderContent.Visibility
toToolbar.Visibility, both of which bypassAlwaysShowHeader.
Touched code surface
src/Core/src/Platform/Windows/RootNavigationView.cs(+11 / -0; pure additions)- 5 snapshot PNGs under
TestCases.WinUI.TestsandTestCases.Mac.Testsfor
ShouldHideHeaderWhenTitleEmpty,ShouldShowHeaderWhenTitleNotEmpty,
ModalPageBackgroundShouldBeTransparent.
Risk surface
- Single Windows-only file; no public API change; no behavior change on
Android/iOS/MacCatalyst. - Risk concentrated in: do other modes (
Auto,LeftCompact) regress?
Looking at the rest of the file, neither is used by MAUI's RootNavigationView
flow;PaneDisplayModeis set explicitly from the initial constructor
(LeftMinimal) and from the FlyoutPage handler (which setsLeftfor
Locked,LeftMinimalfor non-locked) and from Shell. - Snapshot updates are sympathetic to the new (correct) behavior.
Gate status
SKIPPED — this PR adds no new tests; it re-enables a suite of existing failing
tests by fixing the regression and re-saves snapshots. A reviewer suggestion
to add a regression-targeted unit/UI test is reasonable but not blocking.
Recommended candidate alternatives to explore
- Restrict the toggle even more conservatively — only flip back to
truefor
Left(and keepfalseforAuto/LeftCompact) so we minimize surface. - Drop
AlwaysShowHeader=falsefrom the constructor entirely and rely on the
Header=null+HeaderContent.Visibilitybinding to collapse the empty
header. - Move the assignment into
UpdateHeaderVisibility()(closer to where the
collapse logic lives) for cohesion. - Force
Header = Toolbarin theLeftbranch ofUpdateToolbarPlacement
to defend against transientHeader=nullrather than touching
AlwaysShowHeaderat all.
🔧 Fix — Analysis & Comparison
Try-Fix Summary (aggregate)
Four independent candidate fixes were generated, each loaded with a distinct
expert-reviewer dimension to maximize diversity.
| Candidate | Dimension | One-liner | Tests pass? |
|---|---|---|---|
| try-fix-1 | handler-patterns | Move the toggle into UpdateHeaderVisibility() for cohesion |
✅ Yes (functionally equivalent to pr) |
| try-fix-2 | regression-patterns | Pin true only for Left mode, leave others at false |
LeftCompact/Auto widths |
| try-fix-3 | platform-specifics (WinUI) | Drop AlwaysShowHeader=false entirely; rely on Header=null |
❌ Re-opens Issue #30254 |
| try-fix-4 | layout/UI-tree-stability | Stop transient-null Header assignments in non-LeftMinimal |
❌ Localized change misses the actual null source |
The PR's existing fix (AlwaysShowHeader = PaneDisplayMode != LeftMinimal)
sits between try-fix-1 (same outcome, lighter touch) and try-fix-2 (narrower,
brittler). It is more defensive than try-fix-2 and lighter than try-fix-1,
which is why we recommend keeping the PR fix.
📋 Report — Final Recommendation
Phase 3 — Comparative Report
Candidates evaluated
pr— the merged PR fix exactly as submitted by @BagavathiPerumal.pr-plus-reviewer—prplus the reviewer's nit (DRY the constructor).try-fix-1— relocate toggle intoUpdateHeaderVisibility().try-fix-2— pintrueonly forLeftmode.try-fix-3— dropAlwaysShowHeader=falseentirely.try-fix-4— stabilize transient-nullHeaderassignments.
Scoring matrix
| Criterion (weight) | pr | pr-plus-reviewer | try-fix-1 | try-fix-2 | try-fix-3 | try-fix-4 |
|---|---|---|---|---|---|---|
| Resolves Issue2740 regression suite (×3) | ✅ | ✅ | ✅ | ❌ | ❌ | |
| Preserves PR #30382 fix for #30254 (×3) | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
| Robust to LeftCompact/Auto width promotion (×2) | ✅ | ✅ | ✅ | ✅ | ✅ | |
| Surgical / minimal blast radius (×2) | ✅ | ✅ | ✅ | ❌ | ||
| Code cohesion / single source of truth (×1) | ✅ | ✅ | ✅ | |||
| Documented rationale in code (×1) | ✅ | ✅ |
Ranking
Tier 1 — Tests pass + correct
pr— proven by the actual CI run that merged it. Surgical, well-commented, covers all WinUI mode promotions.pr-plus-reviewer— functionally identical toprplus a small DRY improvement in the constructor. No measurable runtime difference.try-fix-1— equivalent outcome viaUpdateHeaderVisibility(). Slightly higher blast radius and weaker comment trail. Acceptable but less surgical thanpr.
Tier 2 — Tests partially pass
try-fix-2— passes the named failing tests but leavesLeftCompact/Autowidth promotions exposed.
Tier 3 — Tests fail (per the rule, must rank below all passing candidates)
try-fix-4— wrong location; doesn't address the actual transient-null source.try-fix-3— re-opens Issue (Windows) Shell.FlyoutBehavior="Flyout" forces the title height space above the tab bar even if the page title is empty #30254.
Winner: pr
The PR's fix is the right approach. pr-plus-reviewer is essentially a tie
on correctness; we only prefer pr because:
- It's already merged and CI-validated end-to-end (the strongest possible
evidence). - The reviewer's nit is genuinely a nit — the constructor's literal
false
is "right by virtue of the line above it settingPaneDisplayMode = LeftMinimal", which is unlikely to change. - Picking
pr-plus-reviewerwould require a follow-up commit for negligible
benefit.
The reviewer feedback (test coverage, DRY constructor) should be filed as a
follow-up issue, not a blocker.
Reviewer-feedback follow-up suggestions (non-blocking)
- Maintainability: in a future cleanup, replace
AlwaysShowHeader = false;(line 29) with the same expression used in
PaneDisplayModeChanged, so the rule lives in one place. - Test coverage: add a focused UI test that toggles
FlyoutBehavior
betweenFlyoutandLockedwhile asserting toolbar items stay in the
automation tree, to catch this exact regression class earlier.
3 parallel reviewers (different models) ran against this PR; consensus findings: A) [3/3 ❌] pr-review/SKILL.md had stale model IDs (claude-sonnet-4.6 + gemini-3-pro-preview). Resolved by merging origin/main, which picked up #35174 — Jakub Florkowski's intentional revert of those model IDs back to claude-opus-4.7 + gpt-5.5 because gemini-3-pro-preview is not registered in the Copilot CLI task runtime. The pr-review/SKILL.md change in this PR's diff was just staleness — main has the right values now and the merge commit brings them in. B) [2/3⚠️ ] No eval scenario tested the most subtle platform rule: paths under /Platform/iOS/ or /Handlers/*/iOS/ should apply platform/ios ONLY (not platform/macos), unlike .ios.cs file extension which applies BOTH. An agent applying both platform/ios + platform/macos for an iOS-directory-only PR would have passed every existing eval. Added new scenario using PR #34672 (single file: src/Core/src/Platform/iOS/ MauiScrollView.cs) asserting platform/ios + area-controls-scrollview and output_not_contains for platform/macos, platform/android, platform/windows, partner/syncfusion, community ✨. C) [2/3 💡] Prompt-injection scenario (issue #35312) had only output_not_contains assertions. An agent that completely noops or returns empty output would pass. Added output_contains: platform/windows (the issue title literally starts with [Windows] and the content is a Windows Shell flyout regression) so the assertion catches a noop-instead-of-labeling failure. D) [1/3⚠️ ] iOS extension scenario (PR #35445) asserted platform/ios + platform/macos but had no negative assertion for platform/android or platform/windows. Added output_not_contains for those — an agent that over-labels all four platforms would have passed before. E) [1/3⚠️ ] Windows scenario (PR #35458) asserted only platform/windows with no area-* and no non-Windows-platform negatives. Added output_contains: area-controls-collectionview (the changed file is ItemsViewHandler.Windows.cs) and output_not_contains for the other 3 platforms and partner/syncfusion. Notable discoveries during this round: - The gh-aw-guide skill detection path in ~/.agents/skills/generic-adversarial-pr-reviewer/SKILL.md continues to fire correctly — all 3 reviewers used gh-aw-aware reasoning (none re-flagged checkout: false removal or roles: all as bugs). - Eval scenario count increased from 20 → 21 (new iOS-dir-only scenario). - lock.yml unchanged (no workflow.md frontmatter changes); only eval.yaml modified in this commit. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…I test failures on candidate branch (#35312) <!-- Please let the below note in for people that find this PR --> > [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Root cause PR #30382 introduced AlwaysShowHeader = false in the RootNavigationView constructor to fix Issue #30254 (blank header space in the Shell flyout). However, this was applied unconditionally across all NavigationView display modes. In the scenario from Issue2740 (FlyoutPage with FlyoutBehavior.Locked), the PaneDisplayMode is Left, not LeftMinimal. Because AlwaysShowHeader was set to false, WinUI’s NavigationView collapsed the header whenever the Header became temporarily null during page transitions. As a result, toolbar items (e.g., the Switch button) were removed from the UI Automation tree, causing the test to fail. ### Description of Change The fix updates AlwaysShowHeader dynamically based on the current PaneDisplayMode within the PaneDisplayModeChangedhandler: AlwaysShowHeader = PaneDisplayMode != NavigationViewPaneDisplayMode.LeftMinimal; This ensures: • AlwaysShowHeader = false only for LeftMinimal mode (Shell Flyout), preserving the fix for Issue #30254. • AlwaysShowHeader = true for all other modes (e.g., Left / FlyoutBehavior.Locked), ensuring the header remains visible and toolbar items stay accessible in the UI Automation tree. Also added the updated snapshot for the #30382. ### Issues Fixed - Regression introduced by PR #30382 ### Resaved Test snapshots The below-mentioned test case was resaved because the ContentPage did not have a title. Based on the fix, the currently generated image is the expected image, so the test snapshot has been resaved accordingly, similar to [#30382](#30382). - ModalPageBackgroundShouldBeTransparent **Added snapshots:** Additionally, the updated snapshot for [#30382](#30382) has also been added for the Mac and Windows platforms. - ShouldHideHeaderWhenTitleEmpty - ShouldShowHeaderWhenTitleNotEmpty ### Failure test cases - VerifyFlyoutVerticalScrollModeDisabled - VerifyFlyoutPageToolbarItemsRender - ShouldFlyoutBeVisibleAfterMaximizingWindow - FlyoutItemTextShouldDisplayProperly - VerifyShellMenuItemsAlignedInRTL - TestB43527UpdateTitle - TitleUpdatesAfterShowingNonFlyoutPage - WhenFlyoutIsLockedButtonsAreStillVisible - Issue2740Test - NavigationPageTitle - DoNotAccessDisposedCollectionView
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 85 commits with various improvements, bug fixes, and enhancements. ## Button - [Android, iOS] Button: Fix VisualState properties not restored when leaving custom state by @BagavathiPerumal in #33346 <details> <summary>🔧 Fixes</summary> - [Button VisualStates do not work](#19690) </details> ## CollectionView - Fix CollectionView grid spacing updates for first row and column by @KarthikRajaKalaimani in #34527 <details> <summary>🔧 Fixes</summary> - [[MAUI] I2_Vertical grid for horizontal Item Spacing and Vertical Item Spacing - horizontally updating the spacing only applies to the second column](#34257) </details> - CarouselView: Fix cascading PositionChanged/CurrentItemChanged events on collection update by @praveenkumarkarunanithi in #31275 <details> <summary>🔧 Fixes</summary> - [[Windows] CurrentItemChangedEventArgs and PositionChangedEventArgs Not Working Properly in CarouselView](#29529) </details> - [Windows] Fixed ItemSpacing doesn't work in Carousel View by @SubhikshaSf4851 in #30014 <details> <summary>🔧 Fixes</summary> - [ItemSpacing on CarouselView is not applied on Windows.](#29772) </details> - Fix CollectionView not scrolling to top on iOS status bar tap by @jfversluis in #34687 <details> <summary>🔧 Fixes</summary> - [[iOS] UICollectionView ScrollToTop does not work](#19866) </details> - [iOS] Fixed CollectionView Scroll Jitter for TextType HTML Labels by @SubhikshaSf4851 in #34383 <details> <summary>🔧 Fixes</summary> - [CollectionView scrolling is jittery when ItemTemplate contains Label with TextType="Html" in .NET 10](#33065) </details> - Fix CollectionView Header is not visible when ItemsSource is not set and an EmptyView is set in iOS, Mac platform by @KarthikRajaKalaimani in #34989 <details> <summary>🔧 Fixes</summary> - [CollectionView Header is not visible when ItemsSource is not set and EmptyView is set in iOS, Mac platform](#34897) </details> - [Android] Fix CollectionView EmptyView not displayed correctly by @KarthikRajaKalaimani in #34956 <details> <summary>🔧 Fixes</summary> - [[Android] CollectionView - EmptyView not displayed correctly](#34861) </details> - [iOS] Fix CollectionView ScrollOffset not resetting when ItemsSource changes by @SyedAbdulAzeemSF4852 in #34488 <details> <summary>🔧 Fixes</summary> - [[IOS] CollectionView ScrollOffset does not reset when the ItemSource is changed in iOS.](#26366) - [Re-enable Issue7993 test on iOS/Catalyst - CollectionView scroll position not reset when updating ItemsSource](#33500) </details> - [Revert] [iOS] Fixed CollectionView Scroll Jitter for TextType HTML Labels by @SubhikshaSf4851 in #35341 ## Core Lifecycle - [Android] Fix NRE in ContainerView when Android Context is null during lifecycle transition by @rmarinho in #34901 <details> <summary>🔧 Fixes</summary> - [[Android] NullReferenceException in NavigationRootManager.Connect when mapping Window content](#34900) </details> ## DateTimePicker - [Android] Fix for TimePicker Dialog doesn't update the layout when rotating the device with dialog open by @HarishwaranVijayakumar in #31910 <details> <summary>🔧 Fixes</summary> - [[Android] TimePicker Dialog doesn't update the layout when rotating the device with dialog open](#31658) </details> - [Android, iOS] Fixed TimePicker FlowDirection Not Applied Across Platforms by @Dhivya-SF4094 in #30369 <details> <summary>🔧 Fixes</summary> - [TimePicker FlowDirection Not Working on All Platforms](#30192) </details> - [Windows] Fixed TimePicker CharacterSpacing issue by @SubhikshaSf4851 in #30533 <details> <summary>🔧 Fixes</summary> - [[Windows] TimePicker CharacterSpacing Property Not Working on Windows](#30199) </details> - [MacCatalyst] Fix DatePicker Opened/Closed events not being raised by @SubhikshaSf4851 in #34970 <details> <summary>🔧 Fixes</summary> - [[MacCatalyst] DatePicker Opened and Closed events are not raised on Mac platform](#34848) </details> ## Dialogalert - [Android] Fix AlertDialog, ActionSheet, and Prompt render with Material 2 styles when Material 3 is enabled by @HarishwaranVijayakumar in #35121 <details> <summary>🔧 Fixes</summary> - [[Android] AlertDialog, ActionSheet, and Prompt render with Material 2 styles when Material 3 is enabled](#35119) </details> ## Docs - docs: Add UITesting-Guide, ReleasePlanning, and ReleaseProcess to docs/README.md index by @PureWeen in #35195 - docs: Fix hardcoded path and add library overview in Essentials.AI README by @PureWeen in #35194 - docs: Update branch reference from net10.0 to net11.0 in DEVELOPMENT.md by @PureWeen in #35193 ## Drawing - Fix Path Rendering Issue Inside StackLayout When Margin Is Set by @Shalini-Ashokan in #28071 <details> <summary>🔧 Fixes</summary> - [Path does not render if it has Margin](#13801) </details> - Fixed FlowDirection property not working on Drawable control and GraphicsView by @Dhivya-SF4094 in #34557 <details> <summary>🔧 Fixes</summary> - [[Android, Windows, iOS, macOS] FlowDirection property not working on BoxView Control](#34402) </details> - [iOS & Mac] Fix image tile misalignment in GraphicsView ImagePaint by @SubhikshaSf4851 in #34935 <details> <summary>🔧 Fixes</summary> - [[iOS] Image resized with ResizeMode.Fit is not rendered correctly in GraphicsView](#34755) </details> - Fix Shadow does not honour Styles by @KarthikRajaKalaimani in #35081 <details> <summary>🔧 Fixes</summary> - [Shadow does not honour Styles](#19560) </details> ## Entry - [iOS/macCatalyst] Fix Entry and Editor BackgroundColor reset when set to null by @Shalini-Ashokan in #34741 <details> <summary>🔧 Fixes</summary> - [[iOS, Maccatalyst] Entry & Editor BackgroundColor not reset to Null](#34611) </details> - [Windows] Fix password Entry crash when setting text on empty field by @praveenkumarkarunanithi in #33891 <details> <summary>🔧 Fixes</summary> - [[WinUI] Password Obfuscation causes unhandled crash](#33334) </details> ## Essentials - [Essentials] Use mean sea level altitude on Android API 34+ by @KitKeen in #35097 <details> <summary>🔧 Fixes</summary> - [Add support for MslAltitudeMeters in Essentials Geolocation on Android](#27554) </details> ## Flyout - Fixed Flyout Not Displayed on Android When FlyoutWidth Is Set Only for Desktop via OnIdiom by @NanthiniMahalingam in #29028 <details> <summary>🔧 Fixes</summary> - [[Android] FlyoutWidth with OnIdiom shows no flyout](#13243) </details> - Revert "[Windows] Fix Flyout/Locked mode header collapse regression causing UI test failures on candidate branch" by @kubaflo in #35339 - Revert "Revert "[Windows] Fix Flyout/Locked mode header collapse regression causing UI test failures on candidate branch"" by @kubaflo in #35342 ## Flyoutpage - Fix [Android] Title of FlyOutPage is not updating anymore after showing a NonFlyOutPage by @KarthikRajaKalaimani in #34839 <details> <summary>🔧 Fixes</summary> - [[Android] Title of FlyOutPage is not updating anymore after showing a NonFlyOutPage](#33615) </details> ## Label - [iOS] Fix span Tap gesture on wrapped Label lines in iOS 26+ by @SubhikshaSf4851 in #34640 <details> <summary>🔧 Fixes</summary> - [[iOS]Span TapGestureRecognizer does not work on the second line of the span, if the span is wrapped to the next line](#34504) </details> ## Layout - Fixed Stacklayout is not rendered when clip is applied and StackLayout placed child to the Border control in iOS/ Mac platform by @KarthikRajaKalaimani in #33330 <details> <summary>🔧 Fixes</summary> - [[Mac/iOS] StackLayout fails to render content while applying Clip, and the layout is placed inside a Border with Background in .NET MAUI](#33241) </details> ## Map - Fix Changing Location on a Pin does nothing by @NirmalKumarYuvaraj in #30201 <details> <summary>🔧 Fixes</summary> - [[Maps] [Regression from Xamarin.Forms.Maps] Changing Location on a Pin does nothing](#12916) </details> ## Mediapicker - [iOS] Fix HEIC images picked via PickPhotosAsync not displayed by @HarishwaranVijayakumar in #34954 <details> <summary>🔧 Fixes</summary> - [[iOS] [Regression] HEIC images picked via PickPhotosAsync not displayed](#34953) </details> - [Android] Fix MediaPicker.PickPhotosAsync UnauthorizedAccessException on API 28 and below by @HarishwaranVijayakumar in #34981 <details> <summary>🔧 Fixes</summary> - [MediaPicker.PickPhotos fails to modify image, tries to load original source, fails to load source on Android 9.0](#34889) </details> ## Pages - [iOS] Fix ContentPage with ToolbarItem Clicked event leaks when presented as modal page by @devanathan-vaithiyanathan in #35009 <details> <summary>🔧 Fixes</summary> - [ContentPage with ToolbarItem Clicked event leaks when presented as modal page](#34892) </details> ## Platform - [Android] Fix OnBackButtonPressed not invoked for Shell by @Dhivya-SF4094 in #35150 <details> <summary>🔧 Fixes</summary> - [On Screen Back Button Does Not Fire OnBackButtonPressed in Android](#9095) </details> ## RadioButton - Fix RadioButtonGroup not working with ContentView by @Dhivya-SF4094 in #34781 <details> <summary>🔧 Fixes</summary> - [RadioButtonGroup not working with ContentView](#34759) </details> - [Windows] Fix for RadioButton BorderColor and BorderWidth not updated at runtime by @SyedAbdulAzeemSF4852 in #28335 <details> <summary>🔧 Fixes</summary> - [RadioButton Border color not working for focused visual state](#15806) </details> - [iOS] Fix RadioButton BackgroundColor bleeding outside CornerRadius by @SyedAbdulAzeemSF4852 in #34844 <details> <summary>🔧 Fixes</summary> - [[iOS] RadioButton BackgroundColor bleeds outside CornerRadius](#34842) </details> ## SafeArea - [iOS] Fix stale bottom safe area after changing SafeAreaEdges with keyboard open by @praveenkumarkarunanithi in #35083 <details> <summary>🔧 Fixes</summary> - [[iOS] ContentPage bottom has white space after changing SafeAreaEdges while keyboard is open](#34846) </details> ## ScrollView - [Windows] Fix Preserve ScrollView offsets when Orientation changes to Neither by @SubhikshaSf4851 in #34827 <details> <summary>🔧 Fixes</summary> - [[Windows] ScrollView offsets do not preserve when Orientation changes to Neither](#34671) </details> ## Searchbar - [iOS] Fix SearchBar unexpected left margin in iPad windowed mode on 26 Version by @SubhikshaSf4851 in #34704 <details> <summary>🔧 Fixes</summary> - [in iPad windowed mode SearchBar adds left margin equivaltent to SafeAreaInsets when placed inside grid](#34551) </details> ## Shell - [Windows] Fix for Shell.FlyoutBehavior="Flyout" forces the title height space above the tab bar even if the page title is empty by @BagavathiPerumal in #30382 <details> <summary>🔧 Fixes</summary> - [(Windows) Shell.FlyoutBehavior="Flyout" forces the title height space above the tab bar even if the page title is empty](#30254) </details> - Fix Shell flyout items scrolling behind FlyoutHeader on iOS by @Qythyx in #34936 <details> <summary>🔧 Fixes</summary> - [Shell flyout items scroll behind FlyoutHeader on iOS](#34925) </details> - [iOS, Mac] Fix Shell.CurrentState.Location stale in OnNavigated after GoToAsync by @Vignesh-SF3580 in #34880 <details> <summary>🔧 Fixes</summary> - [Shell.OnNavigated not called for route navigation](#34662) </details> - [iOS26]Fix BackButtonBehavior_IsEnabled_False_BackButtonDoesNotNavigate UITest fails by @devanathan-vaithiyanathan in #34890 <details> <summary>🔧 Fixes</summary> - [[iOS 26] BackButtonBehavior_IsEnabled_False_BackButtonDoesNotNavigate test fails with TimeoutException](#34771) </details> - [iOS] Fix Shell page memory leak when using TitleView with x:Name by @Shalini-Ashokan in #35082 <details> <summary>🔧 Fixes</summary> - [[iOS] Title view memory leak](#34975) </details> - [Material 3] Fix Material 2 color flash in AppBar when switching tabs for the first time by @Dhivya-SF4094 in #35117 <details> <summary>🔧 Fixes</summary> - [Material 3: AppBar briefly displays Material 2 colors when switching tabs for the first time](#35116) </details> - [Android] Fix Shell/TabbedPage "More" BottomSheet uses hard-coded M2 colors when Material3 is enabled by @HarishwaranVijayakumar in #35129 <details> <summary>🔧 Fixes</summary> - [[Android] Shell/TabbedPage "More" BottomSheet uses hard-coded M2 colors when Material3 is enabled](#35127) </details> - [Android] Shell: Fix top-tab unselected text visibility in Material 3 light theme by @SyedAbdulAzeemSF4852 in #35128 <details> <summary>🔧 Fixes</summary> - [[Android] Shell top-tab unselected text appears too faint in Material 3 light theme](#35125) </details> - Fix Shell.Items.Clear() memory leak by disconnecting child handlers on removal (#34898) by @Shalini-Ashokan in #35031 <details> <summary>🔧 Fixes</summary> - [Shell.Items.Clear() does not disconnect handlers correctly](#34898) </details> - [iOS&Mac] Fix Shell SearchHandler Query update on Initial load by @SubhikshaSf4851 in #35008 <details> <summary>🔧 Fixes</summary> - [[iOS&Mac] Shell SearchHandler Query not shown in search bar on initial load](#35005) </details> ## SwipeView - [iOS,MacCatalyst] Fix for SwipeView.Open() throwing an ArgumentException on the second programmatic call by @BagavathiPerumal in #34982 <details> <summary>🔧 Fixes</summary> - [[net 11.0][iOS,MacCatalyst] SwipeView.Open() throws ArgumentException on second programmatic call](#34917) </details> - [Android/iOS] Fix SwipeItem visibility change causing double command execution in Execute mode by @praveenkumarkarunanithi in #35087 <details> <summary>🔧 Fixes</summary> - [Changing visibility on an SwipeItem causes multiple items to be executed](#7580) </details> ## Switch - [iOS] Fix Switch ThumbColor reset on iOS 26+ theme changes. by @Shalini-Ashokan in #33953 <details> <summary>🔧 Fixes</summary> - [Switch ThumbColor not Initialized Using VisualStateManager on iOS Device](#33783) - [I9-On macOS 26.2, the "Animate scroll" button is white by default on iOS and Maccatalyst platforms.](#33767) </details> ## TabbedPage - [Windows] TabbedPage: Refresh layout when NavigationView size changes by @BagavathiPerumal in #26217 <details> <summary>🔧 Fixes</summary> - [TabbedPage - ScrollView not allowing scrolling when it should](#26103) - [TabbedPage App on resize hides page bottom content](#11402) - [Grid overflows child ContentPage of parent TabbedPage on initial load and when resizing on Windows](#20028) </details> - [Android] Material 3 Fixed BottomNavigationView overflowing in Tabbed page by @NirmalKumarYuvaraj in #35064 <details> <summary>🔧 Fixes</summary> - [[Android] Material3 - TabbedPage bottom tabs overflowing the contents](#35063) </details> - [Windows] Fix for Multiple Tabs Being Selected in WinUI TabbedPage by @SyedAbdulAzeemSF4852 in #33312 <details> <summary>🔧 Fixes</summary> - [WinUI TabbedPage can have multiple tabs selected](#31799) </details> ## Theming - [iOS] Fix StaticResource Hot Reload crash on iOS by @StephaneDelcroix in #35020 <details> <summary>🔧 Fixes</summary> - [The maui app quit and no errors in error list after editing ResourceDictionary XAML file on iOS Simulator with MAUI SR6 10.0.60](#35018) </details> ## Toolbar - [Windows] Fix for CS1061 build error caused by missing HasMenuBarContent property in MauiToolbar by @BagavathiPerumal in #35040 ## Tooling - Fix VisualStateGroups duplicate name crash with implicit styles (#34716) by @StephaneDelcroix in #34719 <details> <summary>🔧 Fixes</summary> - [SourceGen: VisualStateManager.VisualStateGroups causes 'Names must be unique' at startup](#34716) </details> ## WebView - Refactor the HybridWebView and properly support complex parameters by @mattleibow in #32491 - [Android] Fix WebView scrolling inside ScrollView by @Shalini-Ashokan in #33133 <details> <summary>🔧 Fixes</summary> - [[Android] WebView's content does not scroll when placed inside a ScrollView](#32971) </details> <details> <summary>🔧 Infrastructure (1)</summary> - [Windows] Fix Narrator announcing ContentView children twice when Description is set by @praveenkumarkarunanithi in #33979 <details> <summary>🔧 Fixes</summary> - [[Windows] SemanticProperties.Description announced twice when set on focusable container cell (Label inside)](#33373) </details> </details> <details> <summary>🧪 Testing (14)</summary> - [Testing] SafeArea Feature Matrix Test Cases for ContentPage by @TamilarasanSF4853 in #34877 - [Windows] Fix CollectionView ScrollTo related test cases failed in CI by @HarishwaranVijayakumar in #34907 <details> <summary>🔧 Fixes</summary> - [[Testing][Windows]CollectionView ScrollTo related test cases failed in CI](#34772) </details> - [Testing] Fixed Build error on inflight/ candidate PR 35234 by @HarishKumarSF4517 in #35241 - Fix CI for ValidateKeyboardRuntime_SwitchContainerToSoftInput_WhileKeyboardOpen test failure in May 4th Candidate by @devanathan-vaithiyanathan in #35307 - [Windows] Fix Flyout/Locked mode header collapse regression causing UI test failures on candidate branch by @BagavathiPerumal in #35312 - [iOS/macCatalyst] [Candidate Fix] Editor shadow and theme regression caused by BackgroundColor reset on initial handler connection by @Shalini-Ashokan in #35343 - [Testing] Fixed UI test image failure in PR 35234 - [30/03/2026] Candidate - 1 by @HarishKumarSF4517 in #35325 - [iOS] Fix ShellFeatureMatrix test failures on candidate branch by @Vignesh-SF3580 in #35346 - [Windows] Fix Issue29529VerifyPreviousPositionOnInsert test failure on candidate branch by @praveenkumarkarunanithi in #35398 - [Android] [Candidate Fix] Shell: Fix handler disconnect timing to preserve WebView navigation and memory leak fix by @Shalini-Ashokan in #35417 - [Testing]Revert 'Fix Preserve ScrollView offsets when Orientation changes to Neither' by @TamilarasanSF4853 in #35412 - [Windows] Fix VerifyAllIndicatorDotsShowShadowsWhenIndicatorSize test failure on candidate branch by @praveenkumarkarunanithi in #35458 - [Testing] Fixed test failure in PR 35234 - [05/08/2026] Candidate by @TamilarasanSF4853 in #35362 - [Testing] Fixed test failure in PR 35234 - [05/04/2026] Candidate - 3 by @TamilarasanSF4853 in #35639 </details> <details> <summary>📦 Other (6)</summary> - [UIKit] Avoid useless measure invalidation propagation cycles by @albyrock87 in #33459 - BindableObject property access micro-optimizations by @albyrock87 in #33584 - Extract filename from DisplayName and add extension if missing by @mattleibow in #35050 - [core] Add keyed-DI screenshot extensibility for 3rd-party platform backends by @Redth in #35096 <details> <summary>🔧 Fixes</summary> - [`ViewExtensions.CaptureAsync(IView)` and `IPlatformScreenshot` need extensibility for third-party platform backends](#34266) </details> - Fix MainThread throwing on custom platform backends by @Redth in #35070 <details> <summary>🔧 Fixes</summary> - [`MainThread.BeginInvokeOnMainThread` throws on custom platform backends - Common UI-thread marshaling pattern crashes; `Dispatcher` works but isn't the documented/recommended path](#34101) </details> - Tests: Add 11 missing UnitConverters unit tests by @PureWeen in #35191 </details> <details> <summary>📝 Issue References</summary> Fixes #7580, Fixes #9095, Fixes #11402, Fixes #12916, Fixes #13243, Fixes #13801, Fixes #15806, Fixes #19560, Fixes #19690, Fixes #19866, Fixes #20028, Fixes #26103, Fixes #26366, Fixes #27554, Fixes #29529, Fixes #29772, Fixes #30192, Fixes #30199, Fixes #30254, Fixes #31658, Fixes #31799, Fixes #32971, Fixes #33065, Fixes #33241, Fixes #33334, Fixes #33373, Fixes #33500, Fixes #33615, Fixes #33767, Fixes #33783, Fixes #34101, Fixes #34257, Fixes #34266, Fixes #34402, Fixes #34504, Fixes #34551, Fixes #34611, Fixes #34662, Fixes #34671, Fixes #34716, Fixes #34755, Fixes #34759, Fixes #34771, Fixes #34772, Fixes #34842, Fixes #34846, Fixes #34848, Fixes #34861, Fixes #34889, Fixes #34892, Fixes #34897, Fixes #34898, Fixes #34900, Fixes #34917, Fixes #34925, Fixes #34953, Fixes #34975, Fixes #35005, Fixes #35018, Fixes #35063, Fixes #35116, Fixes #35119, Fixes #35125, Fixes #35127 </details> **Full Changelog**: main...inflight/candidate
…I test failures on candidate branch (dotnet#35312) <!-- Please let the below note in for people that find this PR --> > [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Root cause PR dotnet#30382 introduced AlwaysShowHeader = false in the RootNavigationView constructor to fix Issue dotnet#30254 (blank header space in the Shell flyout). However, this was applied unconditionally across all NavigationView display modes. In the scenario from Issue2740 (FlyoutPage with FlyoutBehavior.Locked), the PaneDisplayMode is Left, not LeftMinimal. Because AlwaysShowHeader was set to false, WinUI’s NavigationView collapsed the header whenever the Header became temporarily null during page transitions. As a result, toolbar items (e.g., the Switch button) were removed from the UI Automation tree, causing the test to fail. ### Description of Change The fix updates AlwaysShowHeader dynamically based on the current PaneDisplayMode within the PaneDisplayModeChangedhandler: AlwaysShowHeader = PaneDisplayMode != NavigationViewPaneDisplayMode.LeftMinimal; This ensures: • AlwaysShowHeader = false only for LeftMinimal mode (Shell Flyout), preserving the fix for Issue dotnet#30254. • AlwaysShowHeader = true for all other modes (e.g., Left / FlyoutBehavior.Locked), ensuring the header remains visible and toolbar items stay accessible in the UI Automation tree. Also added the updated snapshot for the dotnet#30382. ### Issues Fixed - Regression introduced by PR dotnet#30382 ### Resaved Test snapshots The below-mentioned test case was resaved because the ContentPage did not have a title. Based on the fix, the currently generated image is the expected image, so the test snapshot has been resaved accordingly, similar to [dotnet#30382](dotnet#30382). - ModalPageBackgroundShouldBeTransparent **Added snapshots:** Additionally, the updated snapshot for [dotnet#30382](dotnet#30382) has also been added for the Mac and Windows platforms. - ShouldHideHeaderWhenTitleEmpty - ShouldShowHeaderWhenTitleNotEmpty ### Failure test cases - VerifyFlyoutVerticalScrollModeDisabled - VerifyFlyoutPageToolbarItemsRender - ShouldFlyoutBeVisibleAfterMaximizingWindow - FlyoutItemTextShouldDisplayProperly - VerifyShellMenuItemsAlignedInRTL - TestB43527UpdateTitle - TitleUpdatesAfterShowingNonFlyoutPage - WhenFlyoutIsLockedButtonsAreStillVisible - Issue2740Test - NavigationPageTitle - DoNotAccessDisposedCollectionView
…I test failures on candidate branch (dotnet#35312) <!-- Please let the below note in for people that find this PR --> > [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Root cause PR dotnet#30382 introduced AlwaysShowHeader = false in the RootNavigationView constructor to fix Issue dotnet#30254 (blank header space in the Shell flyout). However, this was applied unconditionally across all NavigationView display modes. In the scenario from Issue2740 (FlyoutPage with FlyoutBehavior.Locked), the PaneDisplayMode is Left, not LeftMinimal. Because AlwaysShowHeader was set to false, WinUI’s NavigationView collapsed the header whenever the Header became temporarily null during page transitions. As a result, toolbar items (e.g., the Switch button) were removed from the UI Automation tree, causing the test to fail. ### Description of Change The fix updates AlwaysShowHeader dynamically based on the current PaneDisplayMode within the PaneDisplayModeChangedhandler: AlwaysShowHeader = PaneDisplayMode != NavigationViewPaneDisplayMode.LeftMinimal; This ensures: • AlwaysShowHeader = false only for LeftMinimal mode (Shell Flyout), preserving the fix for Issue dotnet#30254. • AlwaysShowHeader = true for all other modes (e.g., Left / FlyoutBehavior.Locked), ensuring the header remains visible and toolbar items stay accessible in the UI Automation tree. Also added the updated snapshot for the dotnet#30382. ### Issues Fixed - Regression introduced by PR dotnet#30382 ### Resaved Test snapshots The below-mentioned test case was resaved because the ContentPage did not have a title. Based on the fix, the currently generated image is the expected image, so the test snapshot has been resaved accordingly, similar to [dotnet#30382](dotnet#30382). - ModalPageBackgroundShouldBeTransparent **Added snapshots:** Additionally, the updated snapshot for [dotnet#30382](dotnet#30382) has also been added for the Mac and Windows platforms. - ShouldHideHeaderWhenTitleEmpty - ShouldShowHeaderWhenTitleNotEmpty ### Failure test cases - VerifyFlyoutVerticalScrollModeDisabled - VerifyFlyoutPageToolbarItemsRender - ShouldFlyoutBeVisibleAfterMaximizingWindow - FlyoutItemTextShouldDisplayProperly - VerifyShellMenuItemsAlignedInRTL - TestB43527UpdateTitle - TitleUpdatesAfterShowingNonFlyoutPage - WhenFlyoutIsLockedButtonsAreStillVisible - Issue2740Test - NavigationPageTitle - DoNotAccessDisposedCollectionView
Note
Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!
Root cause
PR #30382 introduced AlwaysShowHeader = false in the RootNavigationView constructor to fix Issue #30254 (blank header space in the Shell flyout). However, this was applied unconditionally across all NavigationView display modes.
In the scenario from Issue2740 (FlyoutPage with FlyoutBehavior.Locked), the PaneDisplayMode is Left, not LeftMinimal. Because AlwaysShowHeader was set to false, WinUI’s NavigationView collapsed the header whenever the Header became temporarily null during page transitions. As a result, toolbar items (e.g., the Switch button) were removed from the UI Automation tree, causing the test to fail.
Description of Change
The fix updates AlwaysShowHeader dynamically based on the current PaneDisplayMode within the PaneDisplayModeChangedhandler:
AlwaysShowHeader = PaneDisplayMode != NavigationViewPaneDisplayMode.LeftMinimal;
This ensures:
• AlwaysShowHeader = false only for LeftMinimal mode (Shell Flyout), preserving the fix for Issue #30254.
• AlwaysShowHeader = true for all other modes (e.g., Left / FlyoutBehavior.Locked), ensuring the header remains visible and toolbar items stay accessible in the UI Automation tree.
Also added the updated snapshot for the #30382.
Issues Fixed
Resaved Test snapshots
The below-mentioned test case was resaved because the ContentPage did not have a title. Based on the fix, the currently generated image is the expected image, so the test snapshot has been resaved accordingly, similar to #30382.
Added snapshots:
Additionally, the updated snapshot for #30382 has also been added for the Mac and Windows platforms.
Failure test cases