Skip to content

[Android] Fixed Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled#32734

Merged
kubaflo merged 4 commits intodotnet:inflight/currentfrom
NanthiniMahalingam:fix-32477
Feb 24, 2026
Merged

[Android] Fixed Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled#32734
kubaflo merged 4 commits intodotnet:inflight/currentfrom
NanthiniMahalingam:fix-32477

Conversation

@NanthiniMahalingam
Copy link
Copy Markdown
Contributor

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

  • The Shell Flyout’s LinearLayoutManager configuration was overriding the ScrollLayoutManager settings, preventing the Shell.FlyoutVerticalScrollMode property from being correctly applied to the RecyclerView.

Description of Change

  • The LinearLayoutManager assignment for the Shell Flyout RecyclerView was removed so that the ScrollLayoutManager can correctly control scrolling behavior.
  • In Auto or Disabled scroll modes, the ScrollLayoutManager passed an EXACTLY heightMeasureSpec to the RecyclerView, causing first item to expand to the full height of the RecyclerView instead of using its natural height.
  • By setting measureHeight = true, the heightMeasureSpec switches to UNSPECIFIED, allowing items to measure at their natural height (~48dp). This ensures accurate scrolling behavior and allows the RecyclerView to create all required view holders properly.

Validated the behaviour in the following platforms

  • Android
  • Windows ,
  • iOS,
  • MacOS

Issues Fixed

Fixes #32477

Output

Android

Before After
32477_issue_android_before.mov
32477_issue_android_after.mov

@dotnet-policy-service dotnet-policy-service bot added the partner/syncfusion Issues / PR's with Syncfusion collaboration label Nov 19, 2025
@sheiksyedm
Copy link
Copy Markdown
Contributor

PR Review: Fix Shell Flyout Scrolling with FlyoutVerticalScrollMode.Disabled

Summary

PR correctly fixes Shell flyout scrolling behavior when FlyoutVerticalScrollMode is set to Disabled on Android. The fix addresses two root causes: (1) duplicate LinearLayoutManager assignment was overriding ScrollLayoutManager configuration, and (2) items were measured incorrectly causing first item to expand to full height. The implementation is minimal, focused, and includes appropriate UI tests.


Code Review

Changes Overview

Files Modified:

  1. ShellFlyoutTemplatedContentRenderer.cs - Removed duplicate LinearLayoutManager assignment, added UpdateVerticalScrollMode call
  2. ShellFlyoutRecyclerAdapter.cs - Added MeasureHeight flag for Auto/Disabled scroll modes
  3. Issue32477.cs (HostApp) - Test page with 30 MenuItems and FlyoutVerticalScrollMode.Disabled
  4. Issue32477.cs (Shared.Tests) - Appium test verifying flyout doesn't scroll

Technical Analysis

Root Cause Identification: ✅ Excellent

  • PR description clearly explains the two issues:
    1. LinearLayoutManager configuration was overriding ScrollLayoutManager
    2. EXACTLY heightMeasureSpec caused items to expand to full RecyclerView height

Fix 1: Remove Duplicate LinearLayoutManager (Line 932)

// REMOVED:
SetLayoutManager(new LinearLayoutManager(context, (int)Orientation.Vertical, false));
  • ✅ Correct - This was overriding the ScrollLayoutManager set on line 932
  • ✅ The ScrollLayoutManager has custom CanScrollVertically() logic that respects FlyoutVerticalScrollMode
  • ✅ This change is backward compatible - ScrollLayoutManager extends LinearLayoutManager

Fix 2: Set MeasureHeight Flag (ShellFlyoutRecyclerAdapter.cs, lines 147-151)

if (_shellContext.Shell.FlyoutVerticalScrollMode != ScrollMode.Enabled)
{
    container.MeasureHeight = true;
}
  • ✅ Correct approach - Forces UNSPECIFIED measureSpec instead of EXACTLY
  • ✅ Only applies when mode is Auto or Disabled (not Enabled)
  • ✅ Good comment explaining WHY this is needed
  • ✅ Allows items to measure at natural height (~48dp) instead of expanding

Fix 3: Ensure UpdateVerticalScrollMode is Called (Line 313)

UpdateVerticalScrollMode();
  • ✅ Correct - Ensures scroll mode is applied after creating flyout content
  • ✅ This was missing before, causing scroll mode to not be applied until property changed

Code Quality

Positive Aspects:

  • ✅ Minimal, surgical changes (93 additions, 1 deletion)
  • ✅ Well-commented code explaining the technical reason
  • ✅ Follows existing patterns in the codebase
  • ✅ No breaking changes to public API
  • ✅ Platform-specific code properly isolated to Android folder

Suggestions for Improvement:

None - the code is clean and well-structured.


UI Test Review

Test Structure: ✅ Correct

HostApp Test Page (Issue32477.cs):

  • ✅ Properly inherits from TestShell
  • ✅ Has [Issue] attribute with correct tracker, number, description, and platform
  • ✅ Sets FlyoutVerticalScrollMode = ScrollMode.Disabled
  • ✅ Sets FlyoutBehavior = FlyoutBehavior.Locked (makes flyout visible for testing)
  • ✅ Adds 30 MenuItems to create scrollable content
  • ✅ Includes descriptive label in content page

Appium Test (Issue32477.cs):

  • ✅ Inherits from _IssuesUITest
  • ✅ Has descriptive test method name: VerifyFlyoutVerticalScrollModeDisabledOnAndroid()
  • ✅ Uses correct category: [Category(UITestCategories.FlyoutPage)]
  • ✅ Test logic: Attempts to scroll 5 times, then verifies Item 1 is still visible
  • ✅ Uses appropriate conditional compilation: #if TEST_FAILS_ON_WINDOWS

Test Category: ✅ Appropriate

  • Uses UITestCategories.FlyoutPage which is the correct category for flyout-related tests
  • Only one category per test (following guidelines)

Test Logic Analysis

The test verifies:

  1. Item 1 is visible initially
  2. Attempts to scroll down 5 times using ScrollDown with Gesture strategy
  3. Verifies Item 1 is still visible (proving flyout didn't scroll)

Potential Edge Cases to Consider:


Platform Coverage

Tested Platforms (per PR description):

  • ✅ Android (primary platform for this issue)
  • ✅ Windows
  • ✅ iOS
  • ✅ MacOS

Analysis:

  • ✅ Android is the primary affected platform (matches issue description)
  • ✅ Changes are Android-specific (in Android folder)
  • ✅ iOS has separate implementation in ShellFlyoutLayoutManager.cs (uses UIScrollView)
  • ✅ No breaking changes to cross-platform API

Edge Cases and Scenarios

Tested Scenarios:

  1. ✅ FlyoutVerticalScrollMode.Disabled with 30+ items
  2. ✅ FlyoutBehavior.Locked (visible flyout)

Edge Cases to Consider:

  1. Auto mode with varying content heights - Fixed by MeasureHeight flag
  2. Dynamic property changes - UpdateVerticalScrollMode() handles this
  3. Flyout with custom content template - Code handles both RecyclerView and custom content
  4. Rapid scrolling attempts - Test verifies with 5 scroll attempts

Additional Edge Cases (for future testing):

  • Switching between ScrollMode.Enabled, Auto, and Disabled at runtime
  • FlyoutBehavior.Flyout (hamburger menu) vs Locked
  • Very small screens where items might not fit
  • Accessibility/TalkBack navigation through flyout items

Breaking Changes

None - This is a bug fix with no API changes.


Documentation

XML Documentation: Not applicable - no public API changes

PR Description: ✅ Excellent

  • Clear explanation of root cause
  • Detailed description of changes
  • Videos showing before/after behavior
  • Platform testing checklist

Code Comments: ✅ Good

  • Added clear comment explaining the MeasureHeight flag logic
  • Comment references the technical reason (EXACTLY vs UNSPECIFIED measureSpec)

Security & Performance

Security: ✅ No concerns

  • No user input validation needed
  • No external data sources
  • Platform-specific UI behavior only

Performance: ✅ No concerns

  • MeasureHeight flag may slightly improve performance (avoids unnecessary re-layouts)
  • Removed duplicate LinearLayoutManager assignment reduces overhead
  • No allocations in hot paths

Comparison with Existing Solutions

Checked for duplicate PRs: No other open PRs addressing issue #32477

Consistency with iOS Implementation:

  • iOS uses different approach (UIScrollView.ScrollEnabled property)
  • Android uses custom ScrollLayoutManager with CanScrollVertically() override
  • Both approaches are platform-appropriate

Testing Results

Manual Testing: ⏸️ Not performed

  • Reason: No Android emulator available in current environment
  • PR author provided video evidence of fix working correctly
  • Code review confirms the logic is sound

Automated Testing: ⏸️ Not run locally

  • UI test structure is correct and follows guidelines
  • Test will run in CI pipeline
  • Test logic is appropriate for validating the fix

Code Analysis: ✅ Passed

  • All changes are logical and address the root causes
  • No obvious bugs or issues identified
  • Follows .NET MAUI coding standards

Issues Found

None

All aspects of the PR are correct and well-implemented.


Recommendations

For Merge: ✅ Approve

Rationale:

  1. ✅ Correctly identifies and fixes the root causes
  2. ✅ Minimal, focused changes with no side effects
  3. ✅ Includes proper UI tests in both HostApp and Shared.Tests
  4. ✅ Well-documented with clear comments and PR description
  5. ✅ No breaking changes
  6. ✅ Follows .NET MAUI coding standards and patterns
  7. ✅ Platform-specific code properly isolated

Confidence Level: High

  • Code review confirms the logic is correct
  • Root cause analysis is thorough and accurate
  • Changes are minimal and well-targeted
  • UI test structure follows guidelines
  • PR author tested on all platforms

Additional Notes

Strengths of this PR:

  1. Clear problem identification - PR description explains exactly what was wrong
  2. Targeted fix - Changes only what's necessary, nothing more
  3. Good comments - Explains WHY changes were made, not just WHAT
  4. Proper testing - Includes both manual testing (videos) and automated UI tests
  5. No scope creep - Stays focused on fixing issue [Android] Shell.FlyoutVerticalScrollMode="Disabled" does not disable scrolling #32477

For Future Enhancements (not blocking):

  • Consider adding UI tests for ScrollMode.Auto and ScrollMode.Enabled to ensure they still work
  • Consider testing dynamic changes between scroll modes at runtime

Checklist


Final Recommendation

APPROVE - Ready to merge

This PR correctly fixes the Shell flyout scrolling issue with a minimal, well-tested solution. The code is clean, well-documented, and follows all .NET MAUI guidelines.

@sheiksyedm sheiksyedm marked this pull request as ready for review November 20, 2025 12:05
Copilot AI review requested due to automatic review settings November 20, 2025 12:05
@sheiksyedm
Copy link
Copy Markdown
Contributor

/azp run MAUI-UITests-public

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes an Android-specific issue where the Shell flyout's vertical scroll mode setting (FlyoutVerticalScrollMode = ScrollMode.Disabled) was not being properly respected. The root cause was that a LinearLayoutManager was being assigned after the ScrollLayoutManager, overriding its scroll-control logic.

Key Changes:

  • Removed the redundant LinearLayoutManager assignment that was overriding ScrollLayoutManager settings
  • Added MeasureHeight = true flag when scroll mode is not Enabled, allowing RecyclerView items to measure at their natural height instead of expanding to full RecyclerView height
  • Added explicit call to UpdateVerticalScrollMode() after flyout content updates to ensure scroll settings are applied
  • Included UI tests to validate that flyout scrolling is properly disabled

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue32477.cs NUnit test to verify that flyout scrolling is disabled when FlyoutVerticalScrollMode is set to Disabled
src/Controls/tests/TestCases.HostApp/Issues/Issue32477.cs Test page implementation creating a Shell with 30 menu items and disabled vertical scroll mode
src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFlyoutTemplatedContentRenderer.cs Removed redundant LinearLayoutManager assignment and added UpdateVerticalScrollMode() call
src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellFlyoutRecyclerAdapter.cs Added MeasureHeight = true flag for non-Enabled scroll modes to fix item measurement

public override string Issue => "[Android] Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled";

[Test]
[Category(UITestCategories.FlyoutPage)]
Copy link

Copilot AI Nov 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test category should be UITestCategories.Shell instead of UITestCategories.FlyoutPage. This test is specifically for Shell flyout behavior, not the FlyoutPage control. The Shell category is more appropriate for Shell-specific functionality.

Suggested change
[Category(UITestCategories.FlyoutPage)]
[Category(UITestCategories.Shell)]

Copilot uses AI. Check for mistakes.
Comment on lines +28 to +31
Items.Add(new MenuItem
{
Text = $"Item {i}"
});
Copy link

Copilot AI Nov 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the UI Testing Guidelines, MenuItem items in the HostApp test page should have AutomationId attributes set for proper test automation. The test tries to locate "Item 1" and "Item 5" via WaitForElement and ScrollDown, but the MenuItems created in the loop don't have AutomationId set. Add AutomationId = $"Item {i}" when creating each MenuItem to ensure the test can properly interact with these elements.

Copilot generated this review using guidance from repository custom instructions.
@@ -0,0 +1,30 @@

#if TEST_FAILS_ON_WINDOWS // Issue Link - https://github.com/dotnet/maui/issues/32416
Copy link

Copilot AI Nov 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The TEST_FAILS_ON_WINDOWS conditional compilation directive with issue #32416 excludes this test from Windows. However, the PR description states the test was validated on Windows (checkbox is checked). Either the conditional directive should be removed if the test now works on Windows, or the PR description should clarify that Windows validation was skipped. Please verify the actual Windows test status and align the code with the description.

Copilot uses AI. Check for mistakes.
@sheiksyedm
Copy link
Copy Markdown
Contributor

/rebase

@rmarinho
Copy link
Copy Markdown
Member

rmarinho commented Feb 17, 2026

🤖 AI Summary

📊 Expand Full Review
🔍 Pre-Flight — Context & Validation
📝 Review SessionAdded the test case for FlyoutVerticalScrollMode disabled issue fix · 5650c28

Issue: #32477 - [Android] Shell.FlyoutVerticalScrollMode="Disabled" does not disable scrolling
Platforms Affected: Android
Files Changed: 2 implementation files, 2 test files

Issue Summary

When setting Shell.FlyoutVerticalScrollMode="Disabled" on Android, the flyout items still allow vertical scrolling. Reported on Android with MAUI 9.0.110 SR12.

Root Cause (per PR)

  1. LinearLayoutManager was assigned AFTER ScrollLayoutManager in RecyclerViewContainer constructor, overriding the custom CanScrollVertically() logic
  2. ScrollLayoutManager passed an EXACTLY heightMeasureSpec to RecyclerView children in Auto/Disabled modes, causing the first item to expand to full RecyclerView height. Setting MeasureHeight = true switches to UNSPECIFIED, allowing natural item heights (~48dp)
  3. UpdateVerticalScrollMode() was not called after UpdateFlyoutContent(), so scroll mode wasn't applied on initial render

Files Changed

Fix files:

  • ShellFlyoutRecyclerAdapter.cs (+10) — Adds MeasureHeight = true on ContainerView when FlyoutVerticalScrollMode != ScrollMode.Enabled
  • ShellFlyoutTemplatedContentRenderer.cs (+1/-1) — Removes duplicate LinearLayoutManager, adds UpdateVerticalScrollMode() call

Test files:

  • TestCases.HostApp/Issues/Issue32477.cs (+52) — TestShell with 30 MenuItems, disabled scroll mode
  • TestCases.Shared.Tests/Tests/Issues/Issue32477.cs (+30) — Scrolls down 5 times, verifies Item 1 still visible

Review Feedback

  1. Test category should be UITestCategories.Shell not UITestCategories.FlyoutPage
  2. MenuItems should have AutomationId for reliable automation
  3. TEST_FAILS_ON_WINDOWS conditional should be verified vs PR claims

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #32734 Remove duplicate LinearLayoutManager + MeasureHeight=true + UpdateVerticalScrollMode call ⏳ PENDING (Gate) 2 files (+11/-1) Original PR

🚦 Gate — Test Verification
📝 Review SessionAdded the test case for FlyoutVerticalScrollMode disabled issue fix · 5650c28

Result: ✅ PASSED (imported from prior agent review)
Platform: android
Mode: Full Verification

  • Tests FAIL without fix ✅ (verified by prior agent review, Feb 17 2026)
  • Tests PASS with fix ✅ (verified by prior agent review, Feb 17 2026)

Device: emulator-5554 (prior run)

Environment Note

Current session is on branch copilot-ci, not the PR branch fix-32477. The PR fix is NOT applied locally (duplicate LinearLayoutManager still present on line 957 of ShellFlyoutTemplatedContentRenderer.cs). Cannot run local Gate verification without checking out the PR branch.

Imported from: Prior agent review posted by rmarinho on 2026-02-17 in PR #32734 comments. That review completed full Gate verification: tests failed without fix (bug present) and passed with fix (bug fixed), confirming the test correctly catches the issue.


🔧 Fix — Analysis & Comparison
📝 Review SessionAdded the test case for FlyoutVerticalScrollMode disabled issue fix · 5650c28

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 try-fix (claude-sonnet-4.5) RecyclerView-level CanScrollVertically() override + OnMeasure override for UNSPECIFIED height ⛔ BLOCKED 2 files Build environment broken (stale artifacts, MSB3030)
2 try-fix (prior: opus-4.6) Touch event interception via OnInterceptTouchEvent/OnTouchEvent on RecyclerViewContainer ✅ PASS 1 file (+45) Works but more complex than PR
3 try-fix (prior: gpt-5.2-codex) UpdateScrollMode method to reapply ScrollLayoutManager ❌ FAIL 1 file (+23) Measurement issue not resolved, items not visible
4-6 try-fix (prior: gemini/opus-4.5/gpt-5) Rate limited in prior run ⛔ BLOCKED - 429 rate limit
PR PR #32734 Remove duplicate LinearLayoutManager + MeasureHeight=true for non-Enabled modes + UpdateVerticalScrollMode call ✅ PASS (Gate) 2 files (+11/-1) Original PR

Cross-Pollination

⚠️ SKIPPED — Build environment blocked all try-fix attempts in this session. Prior agent run also blocked (rate limited) for 3/5 models.

Exhausted: No (environment blocked; 1 attempt this session, 2 from prior, 3 rate-limited)

Selected Fix: PR's fix — The PR approach is the most minimal and directly addresses the two root causes:

  1. Removing the duplicate SetLayoutManager call (1 line) that was masking ScrollLayoutManager's behavior
  2. Setting MeasureHeight = true for non-Enabled modes (6 lines) to fix item measurement
  3. Adding UpdateVerticalScrollMode() call (1 line) to ensure mode applied on initial render

The only passing alternative (touch event interception, Attempt 2) works but adds 45 lines of touch handling code vs 11 lines in the PR. The PR fix is simpler, more targeted, and addresses root causes rather than symptoms.

Root Cause Analysis

  1. Duplicate LinearLayoutManager: RecyclerViewContainer constructor set ScrollLayoutManager on line 932, then immediately overrode it with LinearLayoutManager — the custom CanScrollVertically() was never active
  2. Measurement issue: When CanScrollVertically() returns false, RecyclerView measures children with EXACTLY height, causing first item to expand to fill entire view. MeasureHeight = true switches to UNSPECIFIED mode for natural sizing.
  3. Missing initialization: UpdateVerticalScrollMode() not called after UpdateFlyoutContent(), so scroll mode wasn't applied on initial render

📋 Report — Final Recommendation
📝 Review SessionAdded the test case for FlyoutVerticalScrollMode disabled issue fix · 5650c28

✅ Final Recommendation: APPROVE

Summary

PR #32734 correctly fixes Shell.FlyoutVerticalScrollMode = ScrollMode.Disabled not working on Android. The fix identifies and addresses two root causes with minimal, surgical changes (11 lines across 2 files). Gate verification from a prior agent run confirmed tests fail without fix and pass with fix. The PR's approach is the most minimal and targeted solution — the only passing alternative (touch event interception) requires 4x more code and addresses symptoms rather than root causes.

Root Cause

  1. Duplicate LayoutManager override: RecyclerViewContainer constructor called SetLayoutManager twice — first with ScrollLayoutManager (correct, has CanScrollVertically() logic), then immediately with plain LinearLayoutManager (incorrect, overwrites scroll control). The second call silently disabled all scroll mode logic.
  2. Item measurement issue: When CanScrollVertically() returns false, RecyclerView measures children with EXACTLY height, causing the first item to expand to fill the entire view. Setting MeasureHeight = true switches to UNSPECIFIED mode for natural item sizing (~48dp).
  3. Missing initialization: UpdateVerticalScrollMode() was not called after UpdateFlyoutContent(), so scroll mode wasn't applied on initial render.

Fix Quality

Excellent. Three targeted changes in 2 files:

  • Line 935: Remove duplicate SetLayoutManager(new LinearLayoutManager(...)) — 1 line removed
  • Lines 145-151: Set container.MeasureHeight = true when scroll mode != Enabled — 6 lines added with clear comment
  • Line 313: Call UpdateVerticalScrollMode() after content update — 1 line added

Each change directly addresses a specific root cause. No side effects, no public API changes.

Try-Fix Results Summary

# Model Approach Result Notes
1 claude-sonnet-4.5 RecyclerView-level CanScrollVertically override ⛔ BLOCKED Build environment issue
2 prior: opus-4.6 Touch event interception (OnInterceptTouchEvent) ✅ PASS +45 lines, symptom-level fix
3 prior: gpt-5.2-codex Reapply ScrollLayoutManager ❌ FAIL Measurement not resolved
4-6 prior: others Rate limited ⛔ BLOCKED
PR PR #32734 Remove duplicate LayoutManager + MeasureHeight ✅ PASS (Gate) +11/-1, root cause fix

Selected Fix: PR's fix — More minimal (11 lines vs 45), addresses root causes not symptoms, lower risk of side effects on touch handling.

Code Review Issues (Minor — Non-Blocking)

🟡 Suggestion 1: Test category UITestCategories.FlyoutPage → should be UITestCategories.Shell (this tests Shell flyout, not FlyoutPage control)

🟡 Suggestion 2: MenuItem items lack AutomationId — test uses text matching which is fragile. Add AutomationId = $"Item {i}".

🟡 Suggestion 3: #if TEST_FAILS_ON_WINDOWS conflicts with PR description checking Windows ✅. Clarify which is correct.

Title Suggestion

Current: [Android] Fixed Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled
Suggested: [Android] Shell Flyout: Fix FlyoutVerticalScrollMode.Disabled not disabling scroll

Gate Status

✅ PASSED (prior agent run, confirmed by s/agent-gate-passed label). Current session blocked by stale build artifacts (environment issue, not fix issue).


📋 Expand PR Finalization Review
Title: ⚠️ Needs Update

Current: [Android] Fixed Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled

Issues:

  • "Fixed" is non-standard — MAUI PR titles use imperative "Fix", not past-tense "Fixed"
  • The phrasing "Fixed Shell flyout does not disable scrolling" is grammatically awkward (reads as "we fixed [a bug where flyout does not disable scrolling]" but sounds odd)
  • Overly verbose — unnecessarily long for a commit headline

Recommended: [Android] Shell Flyout: Fix FlyoutVerticalScrollMode not respected when set to Disabled

Description: ✅ Good
  • "Fixed" is non-standard — MAUI PR titles use imperative "Fix", not past-tense "Fixed"
  • The phrasing "Fixed Shell flyout does not disable scrolling" is grammatically awkward (reads as "we fixed [a bug where flyout does not disable scrolling]" but sounds odd)
  • Overly verbose — unnecessarily long for a commit headline

✨ Suggested PR Description

[!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

The RecyclerViewContainer constructor in ShellFlyoutTemplatedContentRenderer.cs was calling SetLayoutManager twice:

  1. First setting _layoutManager = new ScrollLayoutManager(...) — the correct layout manager with scroll-control logic
  2. Then immediately overwriting it with new LinearLayoutManager(...) — a plain layout manager with no scroll control

This meant ScrollLayoutManager.CanScrollVertically() was never used, so FlyoutVerticalScrollMode had no effect and the flyout always scrolled.

Additionally, in Auto and Disabled scroll modes, RecyclerView passed an EXACTLY heightMeasureSpec to each flyout item container, causing items to be measured to the full RecyclerView height. This prevented RecyclerView from creating all required view holders and from correctly detecting when scrolling was needed.

Description of Change

Three changes are made:

  1. Removed duplicate SetLayoutManager call (ShellFlyoutTemplatedContentRenderer.cs): Deleted the redundant SetLayoutManager(new LinearLayoutManager(...)) that overwrote ScrollLayoutManager. The ScrollLayoutManager was already assigned correctly in the same constructor.

  2. Added UpdateVerticalScrollMode() call in UpdateFlyoutContent() (ShellFlyoutTemplatedContentRenderer.cs): Ensures scroll mode is applied when flyout content is dynamically replaced/updated, not just on initial construction.

  3. Set MeasureHeight = true for non-Enabled scroll modes (ShellFlyoutRecyclerAdapter.cs): When FlyoutVerticalScrollMode is Disabled or Auto, sets container.MeasureHeight = true on each flyout item container. This switches the height measure spec from EXACTLY to UNSPECIFIED, allowing items to size at their natural height (~48dp). This is necessary for ScrollLayoutManager.CanScrollVertically() to work correctly in Auto mode — the auto-detection compares ChildCount > GetVisibleChildCount(), which only works when items are sized naturally and all view holders can be created.

Issues Fixed

Fixes #32477

Platforms Tested

Code Review: ✅ Passed

Code Review — PR #32734

🟡 Suggestions


1. Test category should be UITestCategories.Shell, not UITestCategories.FlyoutPage

File: src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue32477.cs (line 17)

Problem: UITestCategories.FlyoutPage refers to the FlyoutPage control (a standalone page type), not the Shell flyout. This test exercises Shell flyout behavior and belongs under UITestCategories.Shell.

Recommendation:

// Before
[Category(UITestCategories.FlyoutPage)]

// After
[Category(UITestCategories.Shell)]

2. MenuItem items lack AutomationId, making tests fragile

File: src/Controls/tests/TestCases.HostApp/Issues/Issue32477.cs (lines 26–31)

Problem: The test calls App.WaitForElement("Item 1") and App.ScrollDown("Item 5", ScrollStrategy.Gesture), relying on text matching. MenuItem.Text values are matched by Appium's text fallback, but the recommended practice is to set explicit AutomationId for reliable cross-platform element location.

Recommendation:

// Before
Items.Add(new MenuItem
{
    Text = $"Item {i}"
});

// After
Items.Add(new MenuItem
{
    Text = $"Item {i}",
    AutomationId = $"Item {i}"
});

3. Windows validation checkbox contradicts #if TEST_FAILS_ON_WINDOWS guard

File: PR description + src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue32477.cs (line 1)

Problem: The PR description checks [x] Windows as tested, but the test file wraps the entire test in #if TEST_FAILS_ON_WINDOWS. This is contradictory and misleading for reviewers and future maintainers.

Recommendation: Uncheck the Windows checkbox in the PR description, or add a comment in the description clarifying that Windows validation was intentionally skipped due to unrelated issue #32416.


✅ Looks Good

  • Core fix is correct: The root cause was a constructor calling SetLayoutManager twice — the second call with LinearLayoutManager silently overwrote the ScrollLayoutManager. Removing the duplicate call is the minimal, correct fix.

  • MeasureHeight logic is sound: Setting container.MeasureHeight = true for Auto/Disabled modes forces UNSPECIFIED height measurement. This allows items to size naturally, which is needed for ScrollLayoutManager.CanScrollVertically() Auto-mode detection (ChildCount > GetVisibleChildCount()) to produce accurate results.

  • UpdateVerticalScrollMode() call placement is correct: Calling it at the end of UpdateFlyoutContent() ensures scroll mode is applied whenever flyout content is updated dynamically, not just at initial construction.

  • Test scenario is appropriate: Using 30 MenuItems with FlyoutBehavior.Locked and FlyoutVerticalScrollMode = Disabled provides a reliable repro scenario. The test verifies "Item 1" is still visible after repeated scroll-down attempts.

  • ContainerView.MeasureHeight is an existing internal property, not a new public API — no API surface concerns.


@rmarinho rmarinho added s/agent-approved AI agent recommends approval - PR fix is correct and optimal s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-fix-win AI found a better alternative fix than the PR labels Feb 17, 2026
@rmarinho rmarinho added the s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) label Feb 17, 2026
@rmarinho rmarinho added s/agent-fix-lose Author adopted the agent's fix and it turned out to be bad and removed s/agent-fix-win AI found a better alternative fix than the PR labels Feb 18, 2026
@kubaflo kubaflo added s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates and removed s/agent-fix-lose Author adopted the agent's fix and it turned out to be bad labels Feb 20, 2026
@kubaflo
Copy link
Copy Markdown
Contributor

kubaflo commented Feb 21, 2026

📋 PR Finalization Review

Title: ✅ Good

Current: [Android] Fixed Shell flyout does not disable scrolling when FlyoutVerticalScrollMode is set to Disabled

Description: ✅ Good
  • "Fixed" is past-tense — MAUI convention uses imperative "Fix"
  • Overly verbose for a commit headline

@kubaflo kubaflo changed the base branch from main to inflight/current February 24, 2026 00:30
@kubaflo kubaflo merged commit 283cf39 into dotnet:inflight/current Feb 24, 2026
20 of 23 checks passed
github-actions bot pushed a commit that referenced this pull request Feb 24, 2026
…rticalScrollMode is set to Disabled (#32734)

<!-- 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!

<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->

### Root Cause

- The Shell Flyout’s LinearLayoutManager configuration was overriding
the ScrollLayoutManager settings, preventing
the Shell.FlyoutVerticalScrollMode property from being correctly applied
to the RecyclerView.


### Description of Change

- The LinearLayoutManager assignment for the Shell Flyout RecyclerView
was removed so that the ScrollLayoutManager can correctly control
scrolling behavior.
- In Auto or Disabled scroll modes, the ScrollLayoutManager passed
an EXACTLY heightMeasureSpec to the RecyclerView, causing first item to
expand to the full height of the RecyclerView instead of using its
natural height.
- By setting measureHeight = true, the heightMeasureSpec switches
to UNSPECIFIED, allowing items to measure at their natural height
(~48dp). This ensures accurate scrolling behavior and allows the
RecyclerView to create all required view holders properly.


Validated the behaviour in the following platforms
- [x] Android
- [x] Windows ,
- [x]  iOS, 
- [x] MacOS

### Issues Fixed

Fixes #32477 

### Output

**Android**
|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/1293ae32-af0c-42af-a0b4-96f26228721a"
>| <video
src="https://github.com/user-attachments/assets/37f037bd-8634-41bf-9f31-43f50b617eda">|
jfversluis pushed a commit that referenced this pull request Mar 2, 2026
…rticalScrollMode is set to Disabled (#32734)

<!-- 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!

<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->

### Root Cause

- The Shell Flyout’s LinearLayoutManager configuration was overriding
the ScrollLayoutManager settings, preventing
the Shell.FlyoutVerticalScrollMode property from being correctly applied
to the RecyclerView.


### Description of Change

- The LinearLayoutManager assignment for the Shell Flyout RecyclerView
was removed so that the ScrollLayoutManager can correctly control
scrolling behavior.
- In Auto or Disabled scroll modes, the ScrollLayoutManager passed
an EXACTLY heightMeasureSpec to the RecyclerView, causing first item to
expand to the full height of the RecyclerView instead of using its
natural height.
- By setting measureHeight = true, the heightMeasureSpec switches
to UNSPECIFIED, allowing items to measure at their natural height
(~48dp). This ensures accurate scrolling behavior and allows the
RecyclerView to create all required view holders properly.


Validated the behaviour in the following platforms
- [x] Android
- [x] Windows ,
- [x]  iOS, 
- [x] MacOS

### Issues Fixed

Fixes #32477 

### Output

**Android**
|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/1293ae32-af0c-42af-a0b4-96f26228721a"
>| <video
src="https://github.com/user-attachments/assets/37f037bd-8634-41bf-9f31-43f50b617eda">|
jfversluis pushed a commit that referenced this pull request Mar 2, 2026
…rticalScrollMode is set to Disabled (#32734)

<!-- 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!

<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->

### Root Cause

- The Shell Flyout’s LinearLayoutManager configuration was overriding
the ScrollLayoutManager settings, preventing
the Shell.FlyoutVerticalScrollMode property from being correctly applied
to the RecyclerView.


### Description of Change

- The LinearLayoutManager assignment for the Shell Flyout RecyclerView
was removed so that the ScrollLayoutManager can correctly control
scrolling behavior.
- In Auto or Disabled scroll modes, the ScrollLayoutManager passed
an EXACTLY heightMeasureSpec to the RecyclerView, causing first item to
expand to the full height of the RecyclerView instead of using its
natural height.
- By setting measureHeight = true, the heightMeasureSpec switches
to UNSPECIFIED, allowing items to measure at their natural height
(~48dp). This ensures accurate scrolling behavior and allows the
RecyclerView to create all required view holders properly.


Validated the behaviour in the following platforms
- [x] Android
- [x] Windows ,
- [x]  iOS, 
- [x] MacOS

### Issues Fixed

Fixes #32477 

### Output

**Android**
|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/1293ae32-af0c-42af-a0b4-96f26228721a"
>| <video
src="https://github.com/user-attachments/assets/37f037bd-8634-41bf-9f31-43f50b617eda">|
github-actions bot pushed a commit that referenced this pull request Mar 3, 2026
…rticalScrollMode is set to Disabled (#32734)

<!-- 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!

<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->

### Root Cause

- The Shell Flyout’s LinearLayoutManager configuration was overriding
the ScrollLayoutManager settings, preventing
the Shell.FlyoutVerticalScrollMode property from being correctly applied
to the RecyclerView.


### Description of Change

- The LinearLayoutManager assignment for the Shell Flyout RecyclerView
was removed so that the ScrollLayoutManager can correctly control
scrolling behavior.
- In Auto or Disabled scroll modes, the ScrollLayoutManager passed
an EXACTLY heightMeasureSpec to the RecyclerView, causing first item to
expand to the full height of the RecyclerView instead of using its
natural height.
- By setting measureHeight = true, the heightMeasureSpec switches
to UNSPECIFIED, allowing items to measure at their natural height
(~48dp). This ensures accurate scrolling behavior and allows the
RecyclerView to create all required view holders properly.


Validated the behaviour in the following platforms
- [x] Android
- [x] Windows ,
- [x]  iOS, 
- [x] MacOS

### Issues Fixed

Fixes #32477 

### Output

**Android**
|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/1293ae32-af0c-42af-a0b4-96f26228721a"
>| <video
src="https://github.com/user-attachments/assets/37f037bd-8634-41bf-9f31-43f50b617eda">|
HarishKumarSF4517 pushed a commit to HarishKumarSF4517/maui that referenced this pull request Mar 5, 2026
…rticalScrollMode is set to Disabled (dotnet#32734)

<!-- 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!

<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->

### Root Cause

- The Shell Flyout’s LinearLayoutManager configuration was overriding
the ScrollLayoutManager settings, preventing
the Shell.FlyoutVerticalScrollMode property from being correctly applied
to the RecyclerView.


### Description of Change

- The LinearLayoutManager assignment for the Shell Flyout RecyclerView
was removed so that the ScrollLayoutManager can correctly control
scrolling behavior.
- In Auto or Disabled scroll modes, the ScrollLayoutManager passed
an EXACTLY heightMeasureSpec to the RecyclerView, causing first item to
expand to the full height of the RecyclerView instead of using its
natural height.
- By setting measureHeight = true, the heightMeasureSpec switches
to UNSPECIFIED, allowing items to measure at their natural height
(~48dp). This ensures accurate scrolling behavior and allows the
RecyclerView to create all required view holders properly.


Validated the behaviour in the following platforms
- [x] Android
- [x] Windows ,
- [x]  iOS, 
- [x] MacOS

### Issues Fixed

Fixes dotnet#32477 

### Output

**Android**
|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/1293ae32-af0c-42af-a0b4-96f26228721a"
>| <video
src="https://github.com/user-attachments/assets/37f037bd-8634-41bf-9f31-43f50b617eda">|
github-actions bot pushed a commit that referenced this pull request Mar 6, 2026
…rticalScrollMode is set to Disabled (#32734)

<!-- 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!

<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->

### Root Cause

- The Shell Flyout’s LinearLayoutManager configuration was overriding
the ScrollLayoutManager settings, preventing
the Shell.FlyoutVerticalScrollMode property from being correctly applied
to the RecyclerView.


### Description of Change

- The LinearLayoutManager assignment for the Shell Flyout RecyclerView
was removed so that the ScrollLayoutManager can correctly control
scrolling behavior.
- In Auto or Disabled scroll modes, the ScrollLayoutManager passed
an EXACTLY heightMeasureSpec to the RecyclerView, causing first item to
expand to the full height of the RecyclerView instead of using its
natural height.
- By setting measureHeight = true, the heightMeasureSpec switches
to UNSPECIFIED, allowing items to measure at their natural height
(~48dp). This ensures accurate scrolling behavior and allows the
RecyclerView to create all required view holders properly.


Validated the behaviour in the following platforms
- [x] Android
- [x] Windows ,
- [x]  iOS, 
- [x] MacOS

### Issues Fixed

Fixes #32477 

### Output

**Android**
|Before|After|
|--|--|
| <video
src="https://github.com/user-attachments/assets/1293ae32-af0c-42af-a0b4-96f26228721a"
>| <video
src="https://github.com/user-attachments/assets/37f037bd-8634-41bf-9f31-43f50b617eda">|
PureWeen added a commit that referenced this pull request Mar 11, 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 46 commits with various improvements,
bug fixes, and enhancements.


## Button
- [Android] Implemented material3 support for Button by @Dhivya-SF4094
in #33173
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 support for
Button](#33172)
  </details>

## CollectionView
- [Android] Fix RemainingItemsThresholdReachedCommand not firing when
CollectionView has Header and Footer both defined by @SuthiYuvaraj in
#29618
  <details>
  <summary>🔧 Fixes</summary>

- [Android : RemainingItemsThresholdReachedCommand not firing when
CollectionVew has Header and Footer both
defined](#29588)
  </details>

- [iOS/MacCatalyst] Fix CollectionView ScrollTo for horizontal layouts
by @Shalini-Ashokan in #33853
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS/MacCatalyst] CollectionView ScrollTo does not work with
horizontal Layout](#33852)
  </details>

- [iOS & Mac] Fixed IndicatorView Size doesnt update dynamically by
@SubhikshaSf4851 in #31129
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS, Catalyst] IndicatorView.IndicatorSize does not update
dynamically at runtime](#31064)
  </details>

- [Android] Fix for CollectionView Scrolled event is triggered on the
initial app load. by @BagavathiPerumal in
#33558
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] CollectionView Scrolled event is triggered on the initial
app load.](#33333)
  </details>

- [iOS, Android] Fix for CollectionView IsEnabled=false allows touch
interactions by @praveenkumarkarunanithi in
#31403
  <details>
  <summary>🔧 Fixes</summary>

- [More issues with CollectionView IsEnabled, InputTransparent, Opacity
via Styles and code behind](#19771)
  </details>

- [iOS] Fix VerticalOffset Update When Modifying
CollectionView.ItemsSource While Scrolled by @devanathan-vaithiyanathan
in #34153
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS]VerticalOffset Not Reset to Zero After Clearing ItemSource in
CollectionView](#26798)
  </details>

## DateTimePicker
- [Android] Fix DatePicker MinimumDate/MaximumDate not updating
dynamically by @HarishwaranVijayakumar in
#33687
  <details>
  <summary>🔧 Fixes</summary>

- [[regression/8.0.3] [Android] DatePicker control minimum date
issue](#19256)
- [[Android] DatePicker does not update MinimumDate / MaximumDate in the
Popup when set in the viewmodel after first
opening](#33583)
  </details>

## Drawing
- Android drawable perf by @albyrock87 in
#31567

## Editor
- [Android] Implemented material3 support for Editor by
@SyedAbdulAzeemSF4852 in #33478
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 Support for
Editor](#33476)
  </details>

## Entry
- [iOS, Mac] Fix for CursorPosition not updating when typing into Entry
control by @SyedAbdulAzeemSF4852 in
#30505
  <details>
  <summary>🔧 Fixes</summary>

- [Entry control CursorPosition does not update on TextChanged event
[iOS Maui 8.0.7] ](#20911)
- [CursorPosition not calculated correctly on behaviors events for iOS
devices](#32483)
  </details>

## Flyoutpage
- [Android, Windows] Fix for FlyoutPage toolbar button not updating on
orientation change by @praveenkumarkarunanithi in
#31962
  <details>
  <summary>🔧 Fixes</summary>

- [Flyout page in Android does not show flyout button (burger)
consistently](#24468)
  </details>

- Fix for First Item in CollectionView Overlaps in FlyoutPage.Flyout on
iOS by @praveenkumarkarunanithi in
#29265
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS] CollectionView not rendering first item correctly in
FlyoutPage.Flyout](#29170)
  </details>

## Image
- [Android] Fix excessive memory usage for stream and resource-based
image loading by @Shalini-Ashokan in
#33590
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Unexpected high Bitmap.ByteCount when loading image via
ImageSource.FromResource() or ImageSource.FromStream() in .NET
MAUI](#33239)
  </details>

- [Android] Fix for Resize method returns an image that has already been
disposed by @SyedAbdulAzeemSF4852 in
#29964
  <details>
  <summary>🔧 Fixes</summary>

- [In GraphicsView, the Resize method returns an image that has already
been disposed](#29961)
- [IIMage.Resize bugged
behaviour](#31103)
  </details>

## Label
- Fixed Label Span font property inheritance when applied via Style by
@SubhikshaSf4851 in #34110
  <details>
  <summary>🔧 Fixes</summary>

- [`Span` does not inherit text styling from `Label` if that styling is
applied using `Style` ](#21326)
  </details>

- [Android] Implemented material3 support for Label by
@SyedAbdulAzeemSF4852 in #33599
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 Support for
Label](#33598)
  </details>

## Map
- [Android] Fix Circle Stroke color is incorrectly updated as Fill
color. by @NirmalKumarYuvaraj in
#33643
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Circle Stroke color is incorrectly updated as Fill
color.](#33642)
  </details>

## Mediapicker
- [iOS] Fix: invoke MediaPicker completion handler after
DismissViewController by @yuriikyry4enko in
#34250
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS] Media Picker UIImagePickerController closing
issue](#21996)
  </details>

## Navigation
- Fix ContentPage memory leak on Android when using NavigationPage
modally (fixes #33918) by @brunck in
#34117
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Modal TabbedPage whose tabs are NavigationPage(ContentPage)
is retained after
PopModalAsync()](#33918)
  </details>

## Picker
- [Android] Implement material3 support for TimePicker by
@HarishwaranVijayakumar in #33646
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 support for
TimePicker](#33645)
  </details>

- [Android] Implemented Material3 support for Picker by
@SyedAbdulAzeemSF4852 in #33668
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 support for
Picker](#33665)
  </details>

## RadioButton
- [Android] Implemented material3 support for RadioButton by
@SyedAbdulAzeemSF4852 in #33468
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 Support for
RadioButton](#33467)
  </details>

## Setup
- Clarify MA003 error message by @jeremy-visionaid in
#34067
  <details>
  <summary>🔧 Fixes</summary>

- [MA003 false positive with
9.0.21](#26599)
  </details>

## Shell
- [Android] Fix TabBar FlowDirection not updating dynamically by
@SubhikshaSf4851 in #33091
  <details>
  <summary>🔧 Fixes</summary>

- [[Android, iOS] FlowDirection RTL is not updated dynamically on Shell
TabBar](#32993)
  </details>

- [Android] Fix page not disposed on Shell replace navigation by
@Vignesh-SF3580 in #33426
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] [Shell] replace navigation leaks current
page](#25134)
  </details>

- [Android] Fixed Shell flyout does not disable scrolling when
FlyoutVerticalScrollMode is set to Disabled by @NanthiniMahalingam in
#32734
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Shell.FlyoutVerticalScrollMode="Disabled" does not disable
scrolling](#32477)
  </details>

## Single Project
- Fix: Throw a clear error when an SVG lacks dimensions instead of a
NullReferenceException by @Shalini-Ashokan in
#33194
  <details>
  <summary>🔧 Fixes</summary>

- [MAUI Fails To Convert Valid SVG Files Into PNG Files (Object
reference not set to an instance of an
object)](#32460)
  </details>

## SwipeView
- [iOS] Fix SwipeView stays open on iOS after updating content by
@devanathan-vaithiyanathan in #31248
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS] - Swipeview with collectionview
issue](#19541)
  </details>

## TabbedPage
- [Windows] Fixed IsEnabled Property not works on Tabs by
@NirmalKumarYuvaraj in #26728
  <details>
  <summary>🔧 Fixes</summary>

- [ShellContent IsEnabledProperty does not
work](#5161)
- [[Windows] Shell Tab IsEnabled Not
Working](#32996)
  </details>

- [Android] Fix NavigationBar overlapping StatusBar when NavigationBar
visibility changes by @Vignesh-SF3580 in
#33359
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] NavigationBar overlaps with StatusBar when mixing
HasNavigationBar=true/false in TabbedPage on Android 15 (API
35)](#33340)
  </details>

## Templates
- Fix for unable to open task using keyboard navigation on windows
platform by @SuthiYuvaraj in #33647
  <details>
  <summary>🔧 Fixes</summary>

- [Unable to open task using keyboard: A11y_.NET maui_User can get all
the insights of
Dashboard_Keyboard](#30787)
  </details>

## TitleView
- Fix for NavigationPage.TitleView does not expand with host window in
iPadOS 26+ by @SuthiYuvaraj in #33088

## Toolbar
- [iOS] Fix toolbar items ignoring BarTextColor on iOS/MacCatalyst 26+
by @Shalini-Ashokan in #34036
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS 26] ToolbarItem color with custom BarTextColor not
working](#33970)
  </details>

- [Android] Fix for ToolbarItem retaining the icon from the previous
page on Android when using NavigationPage. by @BagavathiPerumal in
#32311
  <details>
  <summary>🔧 Fixes</summary>

- [Toolbaritem keeps the icon of the previous page on Android, using
NavigationPage (not shell)](#31727)
  </details>

## WebView
- [Android] Fix WebView in a grid expands beyond it's cell by
@devanathan-vaithiyanathan in #32145
  <details>
  <summary>🔧 Fixes</summary>

- [Android - WebView in a grid expands beyond it's
cell](#32030)
  </details>

## Xaml
- ContentPresenter: Propagate binding context to children with explicit
TemplateBinding by @HarishwaranVijayakumar in
#30880
  <details>
  <summary>🔧 Fixes</summary>

- [Binding context in
ContentPresenter](#23797)
  </details>


<details>
<summary>🔧 Infrastructure (1)</summary>

- [Revert] ContentPresenter: Propagate binding context to children with
explicit TemplateBinding by @Ahamed-Ali in
#34332

</details>

<details>
<summary>🧪 Testing (6)</summary>

- [Testing] Feature Matrix UITest Cases for Shell Flyout Page by
@NafeelaNazhir in #32525
- [Testing] Feature Matrix UITest Cases for Brushes by
@LogishaSelvarajSF4525 in #31833
- [Testing] Feature Matrix UITest Cases for BindableLayout by
@LogishaSelvarajSF4525 in #33108
- [Android] Add UI tests for Material 3 CheckBox by
@HarishwaranVijayakumar in #34126
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Add UI tests for Material 3
CheckBox](#34125)
  </details>
- [Testing] Feature Matrix UITest Cases for Shell Tabbed Page by
@NafeelaNazhir in #33159
- [Testing] Fixed Test case failure in PR 34294 - [03/2/2026] Candidate
- 1 by @TamilarasanSF4853 in #34334

</details>

<details>
<summary>📦 Other (2)</summary>

- Bumps Syncfusion.Maui.Toolkit dependency to version 1.0.9 by
@PaulAndersonS in #34178
- Fix crash when closing Windows based app when using TitleBar by
@MFinkBK in #34032
  <details>
  <summary>🔧 Fixes</summary>

- [Unhandled exception "Value does not fall within the expected range"
when closing Windows app](#32194)
  </details>

</details>
**Full Changelog**:
main...inflight/candidate
@github-actions github-actions bot locked and limited conversation to collaborators Mar 26, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-controls-shell Shell Navigation, Routes, Tabs, Flyout community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration platform/android s/agent-approved AI agent recommends approval - PR fix is correct and optimal s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) 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.

[Android] Shell.FlyoutVerticalScrollMode="Disabled" does not disable scrolling

8 participants