Skip to content

[iOS] Fix ShellFeatureMatrix test failures on candidate branch#35346

Merged
kubaflo merged 1 commit into
dotnet:inflight/candidatefrom
Vignesh-SF3580:fix-34936TestFailures
May 8, 2026
Merged

[iOS] Fix ShellFeatureMatrix test failures on candidate branch#35346
kubaflo merged 1 commit into
dotnet:inflight/candidatefrom
Vignesh-SF3580:fix-34936TestFailures

Conversation

@Vignesh-SF3580
Copy link
Copy Markdown
Contributor

Root Cause

SetHeaderContentInset() in ShellFlyoutLayoutManager.cs contains an offset compensation block that executes for all FlyoutHeaderBehavior values. This logic was originally intended for Scroll and CollapseOnScroll, where the inset changes dynamically during scrolling.
PR #34936 introduced a frame-based layout for Default and Fixed, but the compensation logic was not excluded for those modes. As a result, it still computes a non-zero offset adjustment based on the inset change and incorrectly shifts the content upward.

Regression PR: #34936

Test name:

VerifyShellFlyout_HeightAndWidthWithBackgroundColor
VerifyShellFlyout_BackgroundColorWithHeaderAndFooter
VerifyShellFlyout_BackgroundImageWithHeaderAndFooter
VerifyShellFlyout_DisplayOptionsWithHeaderAndFooter, VerifyShellFlyout_DisplayOptionsWithHeaderTemplateAndFooterTemplate

How the Regression Occurred

PR #34936 updated SetHeaderContentInset() to set ContentInset.Top = 0 for Default and Fixed behaviors, since the scroll frame now starts physically below the header. However, the existing offset compensation block later in the same method continued to run for all behaviors.
When a header is applied at runtime, this block reads the previous inset value, calculates the difference from the new inset (0), and applies that delta to ContentOffset.Y. This unintentionally scrolls the item list upward, causing the first item to disappear behind the header.

Description of Changes

After setting ContentInset to zero:

  • Added UpdateVerticalScrollMode() to apply the current scroll mode before exiting the method.
  • Added an early return to prevent execution of the offset compensation block for Default and Fixed behaviors.

No other logic was modified. The Scroll and CollapseOnScroll path, including the compensation block itself, remains unchanged from PR #34936, preserving the intended collapsing-header behavior.

Test result

Before Issue Fix After Issue Fix

@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented May 8, 2026

🤖 AI Summary

👋 @Vignesh-SF3580 — new AI review results are available. Please review the latest session below.

📊 Review Session4c90d08 · Update ShellFlyoutLayoutManager.cs · 2026-05-08 10:21 UTC
🚦 Gate — Test Before & After Fix

Gate Result: ⚠️ SKIPPED

No tests were detected in this PR.

Recommendation: Add tests to verify the fix using the write-tests-agent.


🧪 UI Tests — Category Detection

Full UI test matrix will run (no specific categories detected from PR changes).


🔍 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

Phase 1 — Pre-Flight: PR #35346

PR Summary

  • Title: [iOS] Fix ShellFeatureMatrix test failures on candidate branch
  • Author: Vignesh-SF3580 (community ✨ / partner/syncfusion)
  • Base branch: inflight/candidate
  • Head branch: fix-34936TestFailures
  • State: OPEN
  • Files changed: 1 file, +6/-2
    • src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutLayoutManager.cs
  • Labels: platform/ios, area-testing, community, partner/syncfusion, shell-flyout
  • Platform: iOS only

Bug / Regression

PR #34936 introduced a frame-based layout for FlyoutHeaderBehavior.Default and Fixed (scroll view positioned physically below the header, content inset top set to 0). However, the existing offset-compensation block in SetHeaderContentInset() continued to run for ALL behaviors. That block reads the previous ContentInset.Top, computes the delta vs. the new inset (now 0), and applies that delta to ContentOffset.Y. When a header is added at runtime, the content gets scrolled upward by the magnitude of the previous inset, hiding the first flyout item behind the header.

Affected tests (UITests):

  • VerifyShellFlyout_HeightAndWidthWithBackgroundColor
  • VerifyShellFlyout_BackgroundColorWithHeaderAndFooter
  • VerifyShellFlyout_BackgroundImageWithHeaderAndFooter
  • VerifyShellFlyout_DisplayOptionsWithHeaderAndFooter
  • VerifyShellFlyout_DisplayOptionsWithHeaderTemplateAndFooterTemplate

Regression PR: #34936

The Fix (PR #35346)

Inside SetHeaderContentInset(), after setting ContentInset = (0,0,0,0) for Default/Fixed:

  1. Call UpdateVerticalScrollMode() to preserve scroll-mode application.
  2. return; early to skip the offset-compensation block (which is only correct for Scroll/CollapseOnScroll where the inset varies dynamically).
if (headerBehavior == FlyoutHeaderBehavior.Default || headerBehavior == FlyoutHeaderBehavior.Fixed)
{
    ScrollView.ContentInset = new UIEdgeInsets(0, 0, 0, 0);
    UpdateVerticalScrollMode();
    return;
}

File Classification

File Area Risk
ShellFlyoutLayoutManager.cs Shell iOS handler / Compatibility layer Low — change is localized to one branch (Default/Fixed) of one method, behind an existing flyout-header behavior conditional.

Code Review Summary (Independence-First)

Findings

  • Root cause is correctly identified. The compensation block at lines 247–251 (offset -= ScrollView.ContentInset.Top; ... ContentOffset = ... + offset;) is only meaningful when the inset varies across calls (Scroll / CollapseOnScroll). For Default/Fixed where the inset is now constantly 0 (post-Fix Shell flyout items scrolling behind FlyoutHeader on iOS #34936), running that block applies a phantom upward scroll equal to the old inset.
  • Early return is the cleanest gate. Restructuring with nested else's would be more invasive; the early return matches the pattern the method already uses (line 213 return; when ScrollView is null).
  • Comment is clear and explains both what and why.
  • Preserves UpdateVerticalScrollMode() invocation, which the original fall-through path called at line 253. Without this explicit call, vertical scroll mode would not be applied for Default/Fixed.

Failure-mode probes (advisory for try-fix)

  1. Switching FlyoutHeaderBehavior dynamically (e.g., Scroll → Fixed): the early return skips the compensation. Since the new mode is Fixed, ContentInset.Top is now 0 and the previously-applied offset compensation from the Scroll path no longer needs to be undone — Default/Fixed uses a frame-based layout and does not rely on ContentOffset for header positioning. Acceptable.
  2. HeaderView == null path (line 242 else branch): unchanged. Still applies safe-area inset and runs compensation. No regression.
  3. HeaderView != null but MeasuredHeaderViewHeightWithNoMargin == NaN: returns at line 221. No change.
  4. No header behavior change (Default at startup): inset goes 0→0, delta is 0, compensation is a no-op. Returning early is still correct and slightly cheaper.

Blast radius

  • Limited to the iOS Shell flyout's SetHeaderContentInset() method when FlyoutHeaderBehavior is Default or Fixed.
  • Does NOT affect Android, Windows, MacCatalyst.
  • Does NOT affect Scroll / CollapseOnScroll behaviors.

Verdict

LGTM (confidence: high). The fix is minimal, targeted, and addresses the root cause introduced by #34936. The early return + explicit UpdateVerticalScrollMode() is the correct minimum-risk pattern.

Concerns / Suggestions

  • ⚠️ Minor: the original method ended with a single UpdateVerticalScrollMode() call. Now that call is duplicated (once in the early-return branch, once at the original tail). Acceptable — alternative would be a try/finally-style restructure that adds risk.
  • 💡 Optional: a UI test specifically guarding against the "first item hidden behind header" regression would future-proof against a similar Fix Shell flyout items scrolling behind FlyoutHeader on iOS #34936-style regression. The PR does not add a new test (gate phase already noted this).

Code Review Hints for Try-Fix (Phase 2)

  • Errors: None.
  • Failure modes: First flyout item hidden behind header when HeaderBehavior is Default/Fixed and a header is applied at runtime; root cause is the post-inset offset-compensation block running unconditionally.
  • Blast radius: iOS Shell flyout, SetHeaderContentInset() for Default/Fixed only.
  • Verdict: LGTM (high confidence).

🔧 Fix — Analysis & Comparison

Phase 2 — Try-Fix Aggregate Summary

Four independent alternative fixes were generated for PR #35346, each from a different MAUI-expert dimension. Each candidate was applied against the broken baseline (PR's diff reverted) and built.

Fix Candidates

# Source Model Approach Build Files Changed Notes
PR PR #35346 n/a Early return; + UpdateVerticalScrollMode() inside Default/Fixed branch n/a (already merged into branch) 1 (+6/-2) Smallest, most surgical
pr-plus-reviewer maui-expert-reviewer n/a (no actionable findings → identical to PR) n/a 0 changes vs PR LGTM
1 try-fix-1 claude-opus-4.6 Restructure: move compensation block INSIDE Scroll/CollapseOnScroll and no-header branches; eliminate the unconditional tail block ✅ PASS 1 (+10/-3 vs broken) Slightly more LOC; impossible for any future code to accidentally compensate Default/Fixed
2 try-fix-2 claude-sonnet-4.6 Tail guard if (newInsetTop > 0) — flow continues to end, compensation skipped when inset is zero ✅ PASS 1 Report mentions a LayoutContent change that is not actually in PR #35346; treat with caution
3 try-fix-3 gpt-5.3-codex Behavior-anchored: snapshot ContentOffset.Y at top, for Default/Fixed restore it verbatim at the tail; non-frame modes keep delta-compensation ❌ FAIL (env: wrong project path Controls-net10.csproj vs Core/Controls.Core.csproj) 1 Code-level approach is sound; build failure is environmental
4 try-fix-4 gpt-5.4 Single-pass plan: compute newInsetTop once, set inset once, gate the offset mutation with shouldCompensateOffset flag; also touches LayoutContent to use HeaderView.Frame.Height for Default/Fixed ❌ FAIL (env: NETSDK1005 missing net10.0-ios in project.assets.json) 1 More invasive — touches two methods; build failure environmental

Cross-Pollination

Skipped — the bug has a small, well-contained surface area (one method branch, ~8 lines) and four diverse independent ideas were already explored:

  • Early return (PR)
  • Scoped per-branch (try-fix-1)
  • Post-condition tail guard (try-fix-2)
  • Snapshot/restore of ContentOffset (try-fix-3)
  • Single-pass plan with explicit flag + LayoutContent change (try-fix-4)

These exhaust the meaningful design axes (control flow exit, branch scoping, post-condition, state snapshot, plan-then-apply). Additional rounds would yield combinations rather than novel approaches.

Exhausted: Yes

Selected Fix

Selected: PR's existing fix (pr).

Reason:

  • Smallest diff (+6/-2 in a single method), minimal blast radius.
  • Addresses the root cause directly at the decision point.
  • Expert reviewer (maui-expert-reviewer) verdict: LGTM (high confidence) with no actionable findings.
  • The two build-PASSING alternatives (try-fix-1 and try-fix-2) are both functionally equivalent but each adds meaningful complexity (try-fix-1: more LOC and shared code duplication; try-fix-2: introduces a guard whose semantics are slightly less clear than an explicit early-return).
  • The two build-FAILING alternatives (try-fix-3 and try-fix-4) are blocked by environmental issues, not by code correctness, but per ranking rules failed candidates rank lower than passing ones — and even ignoring the build state, both touch more surface area than the PR.

Per ranking policy: Candidates that failed regression tests rank lower than those that passed. Since gate is SKIPPED (no tests added), we use build success as the proxy:

  1. pr / pr-plus-reviewer — implicit PASS (PR is the baseline)
  2. try-fix-1 — build PASS
  3. try-fix-2 — build PASS
  4. try-fix-3 — build FAIL (env)
  5. try-fix-4 — build FAIL (env)

📋 Report — Final Recommendation

Phase 3 — Comparative Report: PR #35346

TL;DR

The PR's existing fix is the winner. It is the smallest, most surgical change that addresses the root cause of the regression introduced by PR #34936. The expert reviewer found no actionable issues. Two alternative approaches build cleanly but add complexity for no functional benefit; two more failed to build due to environment issues unrelated to the fix logic.

Recommendation

APPROVE / LGTM — accept the PR as submitted. The author should consider (optional, non-blocking) adding a UI test to lock in the fix and prevent future #34936-style regressions, but this is not a merge-blocker.

Comparative Analysis

Candidate matrix

Candidate Mechanism Files Build Equivalence to PR Risk vs PR
pr Early return in Default/Fixed branch + explicit UpdateVerticalScrollMode() call 1 method, 1 branch ✅ (baseline) Baseline
pr-plus-reviewer Identical to pr (no actionable expert findings) 0 deltas vs PR Identical None
try-fix-1 Restructure: compensation moved into per-branch scopes 1 method, restructured ✅ PASS Functionally equivalent +complexity (more LOC, slight code duplication)
try-fix-2 Post-condition guard if (newInsetTop > 0) at tail 1 method, single guard ✅ PASS Functionally equivalent Less self-evident invariant; report contains an inaccurate LayoutContent claim
try-fix-3 Snapshot/restore ContentOffset.Y for Default/Fixed 1 method ❌ FAIL (env) Plausibly equivalent Cannot verify
try-fix-4 Single-pass plan + shouldCompensateOffset flag + LayoutContent edit 2 methods ❌ FAIL (env) More invasive; touches LayoutContent unnecessarily Higher — broader blast radius

Why PR wins on each dimension

Correctness: Root cause is the unconditional offset-compensation block running for Default/Fixed (where the new inset is constantly 0 post-#34936). The PR gates this at the decision point. All passing alternatives gate at different points but achieve the same outcome.

Simplicity: The PR adds 6 lines (4 of comment + UpdateVerticalScrollMode(); return;). try-fix-1 adds ~10 lines and duplicates the offset-snapshot variable declaration. try-fix-2 introduces a new variable and a guard whose threshold semantics (> 0) require the reader to also know that Math.Max(HeaderMinimumHeight, ...) cannot be negative.

Defensive posture: try-fix-1 is marginally more "future-proof" (any new FlyoutHeaderBehavior enum value would default to the correct behavior of skipping compensation, since the per-branch logic is opt-in). The PR is the inverse: a new enum value would fall through to the compensation block. However, given that FlyoutHeaderBehavior enum changes are rare and reviewed, this benefit does not justify the added complexity.

Reviewer confidence: maui-expert-reviewer returned LGTM with high confidence on the PR. No inline findings (inline-findings.json = []).

Test coverage gap: Gate phase noted no tests were added in this PR. The PR description references existing failing ShellFeatureMatrix UI tests (VerifyShellFlyout_*) that this fix is intended to make pass. A regression test specifically for the "first item hidden behind header" scenario would be valuable but is not blocking — the existing UITest matrix covers the visual outcome.

Risks of NOT picking the alternatives

  • try-fix-1: Adds shared code duplication; harder to maintain if the compensation formula needs to change in the future.
  • try-fix-2: The > 0 guard's correctness depends on a non-obvious post-condition; less self-documenting than the PR's explicit early-return + comment.
  • try-fix-3 / try-fix-4: Cannot empirically verify due to environment build issues; more invasive surface area.

Issues to flag (non-blocking, optional)

  1. 💡 Consider adding a UITest specifically asserting that the first flyout item is visible (not occluded by the header) when FlyoutHeaderBehavior is Default or Fixed. This would prevent another Fix Shell flyout items scrolling behind FlyoutHeader on iOS #34936-style regression.
  2. ℹ️ The PR currently calls UpdateVerticalScrollMode() twice across paths (once in the early-return branch, once at the original tail). This is acceptable; a try/finally-style restructure would add risk for negligible benefit.

Final Verdict

LGTM — approve the PR as submitted.

  • Winner: pr
  • Confidence: high
  • No code changes required
  • Suggested follow-up: regression test (non-blocking)

@MauiBot MauiBot added s/agent-review-incomplete s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels May 8, 2026
@sheiksyedm sheiksyedm marked this pull request as ready for review May 8, 2026 14:57
@sheiksyedm sheiksyedm requested a review from kubaflo May 8, 2026 14:58
@kubaflo kubaflo merged commit d20dd41 into dotnet:inflight/candidate May 8, 2026
33 of 36 checks passed
@github-actions github-actions Bot added this to the .NET 10 SR7 milestone May 8, 2026
@kubaflo kubaflo added s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-changes-requested AI agent recommends changes - found a better alternative or issues and removed s/agent-review-incomplete labels May 20, 2026
github-actions Bot pushed a commit that referenced this pull request May 25, 2026
### Root Cause
SetHeaderContentInset() in ShellFlyoutLayoutManager.cs contains an
offset compensation block that executes for all FlyoutHeaderBehavior
values. This logic was originally intended for Scroll and
CollapseOnScroll, where the inset changes dynamically during scrolling.
PR #34936 introduced a frame-based layout for Default and Fixed, but the
compensation logic was not excluded for those modes. As a result, it
still computes a non-zero offset adjustment based on the inset change
and incorrectly shifts the content upward.

**Regression PR:** #34936

### Test name:
VerifyShellFlyout_HeightAndWidthWithBackgroundColor
VerifyShellFlyout_BackgroundColorWithHeaderAndFooter
VerifyShellFlyout_BackgroundImageWithHeaderAndFooter
VerifyShellFlyout_DisplayOptionsWithHeaderAndFooter,
VerifyShellFlyout_DisplayOptionsWithHeaderTemplateAndFooterTemplate

### How the Regression Occurred
PR #34936 updated SetHeaderContentInset() to set ContentInset.Top = 0
for Default and Fixed behaviors, since the scroll frame now starts
physically below the header. However, the existing offset compensation
block later in the same method continued to run for all behaviors.
When a header is applied at runtime, this block reads the previous inset
value, calculates the difference from the new inset (0), and applies
that delta to ContentOffset.Y. This unintentionally scrolls the item
list upward, causing the first item to disappear behind the header.

### Description of Changes
After setting ContentInset to zero:

- Added UpdateVerticalScrollMode() to apply the current scroll mode
before exiting the method.
- Added an early return to prevent execution of the offset compensation
block for Default and Fixed behaviors.

No other logic was modified. The Scroll and CollapseOnScroll path,
including the compensation block itself, remains unchanged from PR
#34936, preserving the intended collapsing-header behavior.

### Test result
| Before Issue Fix | After Issue Fix |
|----------|----------|
| <img width="800" height="220"
src="https://github.com/user-attachments/assets/8a99dc67-b772-4ad2-b829-b7e8d51b7345">
| <img width="800" height="220"
src="https://github.com/user-attachments/assets/488cd0e7-5a30-41a3-aaba-b7924459cf32">
|
@PureWeen PureWeen mentioned this pull request Jun 2, 2026
PureWeen added a commit that referenced this pull request Jun 2, 2026
## 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-testing Unit tests, device tests community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration platform/ios s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) shell-flyout

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants