Skip to content

[IOS] Inconsistent Resize Behavior for Header/Footer - fix#28713

Merged
kubaflo merged 13 commits intodotnet:inflight/currentfrom
kubaflo:Inconsistent-Resize-Behavior-for-Header/Footer
Apr 2, 2026
Merged

[IOS] Inconsistent Resize Behavior for Header/Footer - fix#28713
kubaflo merged 13 commits intodotnet:inflight/currentfrom
kubaflo:Inconsistent-Resize-Behavior-for-Header/Footer

Conversation

@kubaflo
Copy link
Copy Markdown
Contributor

@kubaflo kubaflo commented Mar 30, 2025

Issues Fixed

Fixes #26397
Fixes #33501

Before After
Simulator.Screen.Recording.-.iPhone.16.Pro.Max.-.2024-12-07.at.16.45.45.mp4
Simulator.Screen.Recording.-.iPhone.16.Pro.Max.-.2024-12-07.at.16.46.35.mp4

Copilot AI review requested due to automatic review settings March 30, 2025 17:14
@kubaflo kubaflo requested a review from a team as a code owner March 30, 2025 17:14
@kubaflo kubaflo self-assigned this Mar 30, 2025
@dotnet-policy-service dotnet-policy-service bot added the community ✨ Community Contribution label Mar 30, 2025
@dotnet-policy-service
Copy link
Copy Markdown
Contributor

Hey there @kubaflo! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed.

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 addresses inconsistent resize behavior for the header and footer on iOS by updating test conditions and adjusting the measurement logic in the flyout content renderer. Key changes include:

  • Enabling header/footer size change tests for iOS in the test project.
  • Adding a new "_header" field and modifying event subscriptions in ShellFlyoutContentRenderer to support the corrected resizing logic.

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/HeaderFooterShellFlyout.cs Updated conditional compilation to include iOS tests for header/footer resize behavior
src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutContentRenderer.cs Introduced a new _header field and modified event subscription logic for header measurement
Comments suppressed due to low confidence (2)

src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/HeaderFooterShellFlyout.cs:70

  • The conditional compilation now includes iOS for header/footer resize tests. Please update or add a comment clarifying why iOS is included to avoid confusion given the removed note about iOS being ignored.
#if ANDROID || IOS

src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutContentRenderer.cs:100

  • It appears the code subscribes to the MeasureInvalidated event on the existing _header before reassigning it, which may result in duplicate event subscriptions or a memory leak. Consider unsubscribing from the old _header's MeasureInvalidated event instead of subscribing again.
if (_header is not null) {

@kubaflo kubaflo added platform/ios area-controls-shell Shell Navigation, Routes, Tabs, Flyout area-controls-flyout Flyout and removed community ✨ Community Contribution labels Mar 30, 2025
@kubaflo kubaflo force-pushed the Inconsistent-Resize-Behavior-for-Header/Footer branch 2 times, most recently from 6ae82fe to 8cccec6 Compare April 2, 2025 23:46
@rmarinho
Copy link
Copy Markdown
Member

rmarinho commented Apr 7, 2025

/azp run

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 3 pipeline(s).

@kubaflo kubaflo force-pushed the Inconsistent-Resize-Behavior-for-Header/Footer branch 2 times, most recently from 9dfc18b to f0f83ea Compare January 14, 2026 14:05
@kubaflo
Copy link
Copy Markdown
Contributor Author

kubaflo commented Jan 14, 2026

PR Review: #28713 - [IOS] Inconsistent Resize Behavior for Header/Footer - fix

Date: 2026-01-14 | Issue: #26397 | PR: #28713

✅ Final Recommendation: APPROVE

PR #28713 correctly fixes issue #26397 by implementing the iOS platform's measure invalidation pattern.

Phase Status
Pre-Flight ✅ COMPLETE
🧪 Tests ✅ COMPLETE
🚦 Gate ✅ PASSED
🔧 Fix ✅ COMPLETE
📋 Report ✅ COMPLETE

📋 Issue Summary

Description:
When the "Resize Header/Footer" menu is tapped in a Shell flyout, the header and footer sizes change but do not remain consistent across multiple taps. The resizing behavior is inconsistent - sizes may vary each time the resize action is triggered.

Steps to Reproduce:

  1. Run the test app (HeaderFooterShellFlyout sample)
  2. Open the Flyout and tap the "Resize Header/Footer" menu
  3. Observe that the header and footer resize
  4. Tap the "Resize Header/Footer" menu again
  5. Tap the "Resize Header/Footer" menu again and observe the size
  6. The size differs from the initial size (inconsistent behavior)

Expected Behavior:
Header and footer should toggle between small (60) and large (200) consistently on each tap.

Actual Behavior:
Header and footer sizes vary and don't maintain consistent toggle behavior.

Platforms Affected:

  • iOS
  • macOS (Mac Catalyst)
  • Android
  • Windows

Regression:
Not confirmed - user was not sure about previous versions

Version with Bug: 9.0.12 SR1.2

📁 Files Changed
File Type Changes
src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutHeaderContainer.cs Fix +11 -1
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/HeaderFooterShellFlyout.cs Test +1 -2

Fix Summary:

  • ShellFlyoutHeaderContainer.cs: Implements IPlatformMeasureInvalidationController interface
    • Adds InvalidateMeasure() method that recalculates size using SizeThatFits and updates frame
    • Returns false to stop propagation after handling resize directly
    • Adds empty InvalidateAncestorsMeasuresWhenMovedToWindow() implementation

Test Summary:

💬 PR Discussion Summary

Key Comments:

  1. PureWeen (Changes Requested) - Line 102 of ShellFlyoutHeaderContainer.cs:

    • "I think we're moving away from subscribing to measure invalidated subscriptions and using the propagation method that @albyrock87 created"
    • Author response: "No problem"
    • Status: ⚠️ INVESTIGATE - Review comment refers to OLD approach (subscribing to MeasureInvalidated event)
    • Note: Current PR implementation uses the NEW approach (IPlatformMeasureInvalidationController interface) which IS the propagation method
  2. Copilot PR Reviewer (Low Confidence Comments):

    • Suggested clarifying why iOS is now included in tests (comment update)
    • Flagged potential memory leak in old version with event subscription (no longer relevant - PR doesn't use event subscription)

Reviewer Feedback:

  • PureWeen requested changes on 2025-03-30: Comment referenced ShellFlyoutContentRenderer.cs:102 about using "propagation method" instead of MeasureInvalidated subscriptions
  • Author responded on 2025-04-02: "No problem" (agreed to change approach)
  • IMPORTANT: The PR diff shows changes to ShellFlyoutHeaderContainer.cs, NOT ShellFlyoutContentRenderer.cs
  • Conclusion: Author changed implementation approach AFTER initial review - now using IPlatformMeasureInvalidationController (the propagation method)

Disagreements to Investigate:

File:Line Reviewer Says Current PR Status
ShellFlyoutContentRenderer.cs:102 Use propagation method instead of MeasureInvalidated Changed to ShellFlyoutHeaderContainer implementing IPlatformMeasureInvalidationController ✅ RESOLVED - Author implemented requested change

Author Uncertainty:

  • None explicitly stated

Edge Cases from Discussion:

  • Memory leak concern with event subscriptions - NOT applicable (author removed event subscription approach)
  • IPlatformMeasureInvalidationController IS the correct "propagation method" - confirmed by interface definition in Core
🧪 Tests

Status: ✅ COMPLETE

  • PR includes UI tests (existing tests modified to enable iOS)
  • Tests compile successfully
  • Tests follow naming convention (uses XFIssue pattern)

Test Files:

  • HostApp: src/Controls/tests/TestCases.HostApp/Issues/XFIssue/HeaderFooterShellFlyout.cs (existing - not modified by PR)
  • NUnit: src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/HeaderFooterShellFlyout.cs (modified to enable iOS)

Test Scenario:
The existing test creates a Shell flyout with header/footer, then taps "Resize Header/Footer" three times:

  1. First tap: Resize from initial to small (60)
  2. Second tap: Resize from small to large (200)
  3. Third tap: Resize from large back to small (60)

Tests verify that:

  • headerSizeLarge.Height > headerSizeSmall.Height
  • footerSizeLarge.Height > footerSizeSmall.Height
  • headerSizeSmall2.Height == headerSizeSmall.Height (consistent toggle)
  • footerSizeSmall2.Height == footerSizeSmall.Height (consistent toggle)

PR Change: Enables these tests for iOS by changing #if ANDROID to #if ANDROID || IOS
Note: Tests were previously disabled for iOS with comment: "These tests are ignored on iOS and Catalyst because the header height doesn't update correctly. Refer to issue: #26397"

🚦 Gate - Test Verification

Status: ✅ PASSED

  • Tests FAIL without fix (bug reproduced)
  • Tests PASS with fix (bug resolved)

Result: PASSED ✅

Verification Details:

  • WITHOUT fix: Tests FAIL (exit code 1) - bug reproduced ✅
  • WITH fix: All tests PASS - bug resolved ✅

Platform Tested: iOS (iPhone Xs simulator)
Test: HeaderFooterShellFlyout - Resize header/footer test
Behavior: Tests verify that header and footer sizes toggle consistently between 60 (small) and 200 (large) on repeated taps

Logs: /Users/kubaflo/Desktop/maui/CustomAgentLogsTmp/UITests/

🔧 Fix Candidates

Status: ✅ COMPLETE

# Source Approach Test Result Files Changed Notes
PR PR #28713 Implement IPlatformMeasureInvalidationController interface - respond to measure invalidation by recalculating size with SizeThatFits and updating frame ✅ PASS (Gate) ShellFlyoutHeaderContainer.cs (+12 -1) Original PR - implements propagation pattern, validated by Gate

PR's Approach:

  • Implements IPlatformMeasureInvalidationController interface on ShellFlyoutHeaderContainer
  • InvalidateMeasure() recalculates size using SizeThatFits(new CGSize(Superview.Frame.Width, double.PositiveInfinity))
  • Updates frame with new calculated size: Frame = new CGRect(Frame.X, Frame.Y, size.Width, size.Height)
  • Returns false to stop propagation (resize handled directly)
  • Empty implementation for InvalidateAncestorsMeasuresWhenMovedToWindow()

try-fix Analysis:

  • No try-fix attempts made - PR's approach is the correct iOS platform pattern
  • Reasoning: The reviewer (PureWeen) explicitly requested using "the propagation method that @albyrock87 created", which is IPlatformMeasureInvalidationController
  • Platform Pattern: This interface is the standard iOS mechanism for handling measure invalidation (see src/Core/src/Platform/iOS/IPlatformMeasureInvalidationController.cs)
  • Alternative approaches would:
    1. Use event subscriptions (MeasureInvalidated) - explicitly rejected by reviewer as deprecated pattern
    2. Manual layout override - would bypass the platform's propagation system
    3. Both violate iOS platform conventions and maintainability guidelines

Exhausted: N/A (iOS platform pattern - no alternatives to explore)
Selected Fix: PR's fix - Implements the correct iOS platform pattern as requested by reviewer


Next Step: Review complete - APPROVE PR #28713

@albyrock87
Copy link
Copy Markdown
Contributor

This may have bad performance, but we'll solve it with #33459

@kubaflo
Copy link
Copy Markdown
Contributor Author

kubaflo commented Jan 14, 2026

@albyrock87 thanks! Do you think this fix is good then?

@albyrock87
Copy link
Copy Markdown
Contributor

Yes it's an acceptable workaround indeed!

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 16, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 28713

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 28713"

Copy link
Copy Markdown
Contributor

@StephaneDelcroix StephaneDelcroix left a comment

Choose a reason for hiding this comment

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

Multi-Model Consensus Review (5 models: claude-opus-4.6 ×2, claude-sonnet-4.6, gemini-3-pro-preview, gpt-5.3-codex)

CI Status: ⚠️ Pre-existing failures (not PR-specific)

Consensus Findings (2+ models agreed)

🟡 MODERATE Superview.Frame.Width with no null guard -- Superview can be null during view lifecycle transitions (e.g., when the view is removed from the hierarchy during rotation or navigation). Accessing Superview.Frame.Width without a null check will throw a NullReferenceException. Add a null-conditional: Superview?.Frame.Width ?? Frame.Width or similar fallback.

Test Coverage

No new tests added for the corrected resize behavior. Suggest adding a UI test that verifies header/footer resize after orientation change or dynamic content update.

Verdict: ⚠️ Request Changes

The fix approach is correct but needs a null guard on Superview before accessing Frame.Width. This is a one-line fix -- once addressed, the PR is ready to merge.

PureWeen and others added 2 commits March 25, 2026 09:44
…otnet#34548)

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

## Description

Adds a [gh-aw (GitHub Agentic
Workflows)](https://github.github.com/gh-aw/introduction/overview/)
workflow that automatically evaluates test quality on PRs using the
`evaluate-pr-tests` skill.

### What it does

When a PR adds or modifies test files, this workflow:
1. **Checks out the PR branch** (including fork PRs) in a pre-agent step
2. **Runs the `evaluate-pr-tests` skill** via Copilot CLI in a sandboxed
container
3. **Posts the evaluation report** as a PR comment using gh-aw
safe-outputs

### Triggers

| Trigger | When | Fork PR support |
|---------|------|-----------------|
| `pull_request` | Automatic on test file changes (`src/**/tests/**`) |
❌ Blocked by `pre_activation` gate |
| `workflow_dispatch` | Manual — enter PR number | ✅ Works for all PRs |
| `issue_comment` (`/evaluate-tests`) | Comment on PR | ⚠️ Same-repo
only (see Known Limitations) |

### Security model

| Layer | Implementation |
|-------|---------------|
| **gh-aw sandbox** | Agent runs in container with scrubbed credentials,
network firewall |
| **Safe outputs** | Max 1 PR comment per run, content-limited |
| **Checkout without execution** | `steps:` checks out PR code but never
executes workspace scripts |
| **Base branch restoration** | `.github/skills/`,
`.github/instructions/`, `.github/copilot-instructions.md` restored from
base branch after checkout |
| **Fork PR activation gate** | `pull_request` events blocked for forks
via `head.repo.id == repository_id` |
| **Pinned actions** | SHA-pinned `actions/checkout`,
`actions/github-script`, etc. |
| **Minimal permissions** | Each job declares only what it needs |
| **Concurrency** | One evaluation per PR, cancels in-progress |
| **Threat detection** | gh-aw built-in threat detection analyzes agent
output |

### Files added/modified

- `.github/workflows/copilot-evaluate-tests.md` — gh-aw workflow source
- `.github/workflows/copilot-evaluate-tests.lock.yml` — Compiled
workflow (auto-generated by `gh aw compile`)
- `.github/skills/evaluate-pr-tests/scripts/Gather-TestContext.ps1` —
Test context gathering script (binary-safe file download, path traversal
protection)
- `.github/instructions/gh-aw-workflows.instructions.md` — Copilot
instructions for gh-aw development

### Known Limitations

**Fork PR evaluation via `/evaluate-tests` comment is not supported in
v1.** The gh-aw platform inserts a `checkout_pr_branch.cjs` step after
all user steps, which may overwrite base-branch skill files restored for
fork PRs. This is a known gh-aw platform limitation — user steps always
run before platform-generated steps, with no way to insert steps after.

**Workaround:** Use `workflow_dispatch` (Actions UI → "Run workflow" →
enter PR number) to evaluate fork PRs. This trigger bypasses the
platform checkout step entirely and works correctly.

**Related upstream issues:**
- [github/gh-aw#18481](github/gh-aw#18481) —
"Using gh-aw in forks of repositories"
- [github/gh-aw#18518](github/gh-aw#18518) —
Fork detection and warning in `gh aw init`
- [github/gh-aw#18520](github/gh-aw#18520) —
Fork context hint in failure messages
- [github/gh-aw#18521](github/gh-aw#18521) —
Fork support documentation

### Fixes

- Fixes dotnet#34602

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com>
## Summary

Enables the copilot-evaluate-tests gh-aw workflow to run on fork PRs by
adding `forks: ["*"]` to the `pull_request` trigger and removing the
fork guard from `Checkout-GhAwPr.ps1`.

## Changes

1. **copilot-evaluate-tests.md**: Added `forks: ["*"]` to opt out of
gh-aw auto-injected fork activation guard. Scoped `Checkout-GhAwPr.ps1`
step to `workflow_dispatch` only (redundant for other triggers since
platform handles checkout).

2. **copilot-evaluate-tests.lock.yml**: Recompiled via `gh aw compile` —
fork guard removed from activation `if:` conditions.

3. **Checkout-GhAwPr.ps1**: Removed the `isCrossRepository` fork guard.
Updated header docs and restore comments to accurately describe behavior
for all trigger×fork combinations (including corrected step ordering).

4. **gh-aw-workflows.instructions.md**: Updated all stale references to
the removed fork guard. Documented `forks: ["*"]` opt-in, clarified
residual risk model for fork PRs, and updated troubleshooting table.

## Security Model

Fork PRs are safe because:
- Agent runs in **sandboxed container** with all credentials scrubbed
- Output limited to **1 comment** via `safe-outputs: add-comment: max:
1`
- Agent **prompt comes from base branch** (`runtime-import`) — forks
cannot alter instructions
- Pre-flight check catches missing `SKILL.md` if fork isn't rebased on
`main`
- No workspace code is executed with `GITHUB_TOKEN` (checkout without
execution)

## Testing

- ✅ `workflow_dispatch` tested against fork PR dotnet#34621
- ✅ Lock.yml statically verified — fork guard removed from `if:`
conditions
- ⏳ `pull_request` trigger on fork PRs can only be verified post-merge
(GitHub Actions reads lock.yml from default branch)

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented Mar 26, 2026

🤖 AI Summary

📊 Expand Full Review9663717 · Address review feedback: add Superview null guard and enable MacCatalyst test
🔍 Pre-Flight — Context & Validation

Issue: #26397 - [IOS, Mac] Inconsistent Resize Behavior for Header/Footer
Issue 2: #33501 - Enable Shell Flyout Header/Footer resize tests on iOS/Catalyst
PR: #28713 - [IOS] Inconsistent Resize Behavior for Header/Footer - fix
Platforms Affected: iOS, macOS (Mac Catalyst) — Android/Windows NOT affected
Files Changed: 3 total: 1 agent-session file (should not be in PR), 1 fix, 1 test

Key Findings

  • Bug: Shell Flyout header/footer sizes toggle inconsistently on iOS/macCatalyst — sizes vary each tap because ShellFlyoutHeaderContainer had no handler for measure-invalidation signals from child views
  • Fix: ShellFlyoutHeaderContainer now implements IPlatformMeasureInvalidationControllerInvalidateMeasure() calls SizeThatFits and updates the view's Frame directly, returns false to stop propagation
  • PureWeen (first review) requested using "propagation method by @albyrock87" — author switched from MeasureInvalidated event subscription to IPlatformMeasureInvalidationController (correct)
  • albyrock87 (author of interface) commented: "This may have bad performance, but we'll solve it with [UIKit] Avoid useless measure invalidation propagation cycles #33459" and confirmed "Yes it's an acceptable workaround indeed!"
  • Prior agent review (Jan 2026): Gate ✅ PASSED, recommended APPROVE. That review found a Superview null-guard bug; author addressed it in latest commit (now uses Superview?.Frame.Width ?? Frame.Width)
  • Gate ✅ PASSED (latest run confirms fix works on iOS)
  • ⚠️ PR includes .github/agent-pr-session/pr-28713.md — this agent session file should not be committed as part of the code change
  • Test change: #if ANDROID#if ANDROID || IOS || MACCATALYST (also enables MacCatalyst, which is correct per issue report)

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #28713 Implement IPlatformMeasureInvalidationController on ShellFlyoutHeaderContainer — intercept measure invalidation, call SizeThatFits, update Frame directly, stop propagation ✅ PASSED (Gate) ShellFlyoutHeaderContainer.cs (+12 -1) Author-acknowledged performance cost, tracked in #33459

🔧 Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 try-fix (claude-opus-4.6) IPlatformMeasureInvalidationController routing through SetNeedsLayout() + OnHeaderSizeChanged() event chain ✅ PASS ShellFlyoutHeaderContainer.cs (+15/-1) Reuses existing layout manager chain; slightly more architecturally consistent
2 try-fix (claude-sonnet-4.6) Subscribe to MeasureInvalidated event in ShellFlyoutContentRenderer ✅ PASS ShellFlyoutContentRenderer.cs (+19/-1) ⚠️ Uses deprecated event-subscription pattern explicitly rejected by PureWeen
3 try-fix (gpt-5.3-codex) IPlatformMeasureInvalidationController with SetNeedsLayout() only ❌ FAIL ShellFlyoutHeaderContainer.cs Async — frame not updated before test assertions
4 try-fix (gpt-5.4) IPlatformMeasureInvalidationController with SetNeedsLayout() + LayoutIfNeeded() ❌ FAIL ShellFlyoutHeaderContainer.cs Forces UIKit layout cycle but doesn't propagate far enough to outer flyout container
PR PR #28713 IPlatformMeasureInvalidationControllerSizeThatFits + direct Frame update, stops propagation ✅ PASS (Gate) ShellFlyoutHeaderContainer.cs (+12/-1) Simplest, self-contained; performance cost acknowledged, tracked in #33459

Cross-Pollination

Model Round New Ideas? Details
claude-opus-4.6 2 NO NEW IDEAS Space exhausted: SizeThatFits must be called (directly or via chain); SetNeedsLayout variants fail
claude-sonnet-4.6 2 NO NEW IDEAS Deprecated event pattern was the only alternative; both passing approaches require synchronous size computation
gpt-5.3-codex 2 NO NEW IDEAS Confirmed: pure-UIKit-layout approaches insufficient without calling SizeThatFits explicitly
gpt-5.4 2 NO NEW IDEAS LayoutIfNeeded() variant exhausted; no further UIKit layout tricks available

Exhausted: Yes — all 4 models queried, no new ideas
Key Insight: Fixes require synchronous size computation (SizeThatFits). SetNeedsLayout() alone or with LayoutIfNeeded() cannot update the flyout container frame in time. The only viable IPlatformMeasureInvalidationController implementations call SizeThatFits either directly (PR) or indirectly via event chain (Attempt 1).

Selected Fix: PR's fix — simpler (12 vs 15 LOC), more self-contained (no dependency on OnHeaderSizeChanged internal event chain), empirically validated by Gate, approved by albyrock87, implements the IPlatformMeasureInvalidationController pattern as requested by PureWeen.


📋 Report — Final Recommendation

✅ Final Recommendation: APPROVE

Phase Status

Phase Status Notes
Pre-Flight ✅ COMPLETE iOS/macCatalyst, Shell Flyout header/footer, 3 changed files (1 fix, 1 test, 1 agent session)
Gate ✅ PASSED iOS — tests FAIL without fix, PASS with fix
Try-Fix ✅ COMPLETE 4 attempts: 2 ✅ PASS, 2 ❌ FAIL; cross-pollination exhausted
Report ✅ COMPLETE

Summary

PR #28713 fixes inconsistent header/footer resize behavior in Shell Flyout on iOS/macCatalyst. When a user tapped "Resize Header/Footer" repeatedly, sizes didn't toggle consistently between small (60px) and large (200px). The fix implements IPlatformMeasureInvalidationController on ShellFlyoutHeaderContainer, the pattern explicitly requested by reviewer PureWeen and created by @albyrock87. Gate confirmed tests pass on iOS. One minor cleanup item needed.

Root Cause

ShellFlyoutHeaderContainer (a UIContainerView subclass) had no handler for the measure-invalidation propagation signal that the MAUI platform fires when a child view changes size. When the header's child MAUI view changed its desired height, the propagation reached ShellFlyoutHeaderContainer but was ignored — the container's UIKit Frame was not updated. On subsequent layout passes, the stale frame was used, causing inconsistent sizing.

Fix Quality

Approach: Implements IPlatformMeasureInvalidationController.InvalidateMeasure() — calls SizeThatFits with the superview's width (with null guard) and directly updates Frame. Returns false to stop propagation since the container handles it locally. Empty InvalidateAncestorsMeasuresWhenMovedToWindow() is appropriate (no pending-window state needed here).

Strengths:

  • Correctly uses IPlatformMeasureInvalidationController as requested by PureWeen (the approved propagation pattern)
  • Superview null guard added (previous review feedback addressed): Superview?.Frame.Width ?? Frame.Width
  • Minimal, self-contained change (12 LOC net-add)
  • Consistent with other implementations in the codebase (TemplatedCell, MauiCollectionView, VisualElementRenderer)
  • Gate ✅ PASSED empirically; @albyrock87 confirmed "acceptable workaround"

Try-Fix comparison: Two independent alternatives also passed (Attempt 1: route through OnHeaderSizeChanged(); Attempt 2: MeasureInvalidated event). Attempt 1 is comparable but adds more complexity. Attempt 2 uses the deprecated event-subscription pattern explicitly rejected by PureWeen. The PR's fix is the simplest and most aligned with reviewer expectations.

Performance note: albyrock87 noted SizeThatFits called synchronously has a performance cost, tracked in issue #33459 and PR #33459. This is a known, accepted trade-off for the workaround.

Selected Fix: PR's fix — simplest passing approach, implements the team's preferred pattern, empirically validated.

Issues to Address Before Merge

Severity Issue File Action
🔴 Must Fix .github/agent-pr-session/pr-28713.md committed in PR .github/agent-pr-session/pr-28713.md Remove this agent session file from the commit — it should not be part of the code change
🟡 Minor MACCATALYST added to test #if but issue title says "[IOS]" — confirm MacCatalyst fix is also validated HeaderFooterShellFlyout.cs:70 Verify fix also works on MacCatalyst or add tracking note if not tested

Decision

APPROVE — The fix is correct, minimal, uses the recommended pattern, and passes all tests. Remove the agent session file before merge.


@MauiBot MauiBot added 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) s/agent-fix-win AI found a better alternative fix than the PR and removed s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates labels Mar 26, 2026
StephaneDelcroix and others added 3 commits March 28, 2026 20:23
…taType is compiled (dotnet#34717)

## Description

Adds regression tests for dotnet#34713 verifying the XAML source generator
correctly handles bindings with `Converter={StaticResource ...}` inside
`x:DataType` scopes.

Closes dotnet#34713

## Investigation

After thorough investigation of the source generator pipeline
(`KnownMarkups.cs`, `CompiledBindingMarkup.cs`, `NodeSGExtensions.cs`):

### When converter IS in page resources (compile-time resolution ✅)

`GetResourceNode()` walks the XAML tree, finds the converter resource,
and `ProvideValueForStaticResourceExtension` returns the variable
directly — **no runtime `ProvideValue` call**. The converter is
referenced at compile time.

### When converter is NOT in page resources (runtime resolution ✅)

`GetResourceNode()` returns null → falls through to `IsValueProvider` →
generates `StaticResourceExtension.ProvideValue(serviceProvider)`. The
`SimpleValueTargetProvider` provides the full parent chain, and
`TryGetApplicationLevelResource` checks `Application.Current.Resources`.
The binding IS still compiled into a `TypedBinding` — only the converter
resolution is deferred.

### Verified on both `main` and `net11.0`

All tests pass on both branches.

## Tests added

| Test | What it verifies |
|------|-----------------|
| `SourceGenResolvesConverterAtCompileTime_ImplicitResources` |
Converter in implicit `<Resources>` → compile-time resolution, no
`ProvideValue` |
| `SourceGenResolvesConverterAtCompileTime_ExplicitResourceDictionary` |
Converter in explicit `<ResourceDictionary>` → compile-time resolution,
no `ProvideValue` |
| `SourceGenCompilesBindingWithConverterToTypedBinding` | Converter NOT
in page resources → still compiled to `TypedBinding`, no raw `Binding`
fallback |
| `BindingWithConverterFromAppResourcesWorksCorrectly` × 3 | Runtime
behavior correct for all inflators (Runtime, XamlC, SourceGen) |

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
<!-- 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!

## Description

Adds arcade inter-branch merge workflow and configuration to automate
merging `net11.0` into the `release/11.0.1xx-preview3` branch.

### Files added

| File | Purpose |
|------|---------|
| `github-merge-flow-release-11.jsonc` | Merge flow config — source
`net11.0`, target `release/11.0.1xx-preview3` |
| `.github/workflows/merge-net11-to-release.yml` | GitHub Actions
workflow — triggers on push to net11.0, daily cron, manual dispatch |

### How it works

Uses the shared [dotnet/arcade inter-branch merge
infrastructure](https://github.com/dotnet/arcade/blob/main/.github/workflows/inter-branch-merge-base.yml):
- **Event-driven**: triggers on push to `net11.0`, with daily cron
safety net
- **ResetToTargetPaths**: auto-resets `global.json`, `NuGet.config`,
`eng/Version.Details.xml`, `eng/Versions.props`, `eng/common/*` to
target branch versions
- **QuietComments**: reduces GitHub notification noise
- Skips PRs when only Maestro bot commits exist

### Incrementing for future releases

When cutting a new release (e.g., preview4), update:
1. `github-merge-flow-release-11.jsonc` → change `MergeToBranch` value
2. `.github/workflows/merge-net11-to-release.yml` → update workflow
`name` field

Follows the same pattern as `merge-main-to-net11.yml` /
`github-merge-flow-net11.jsonc`.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->



<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes dotnet#33355

### Description of Change

This report has the goal to provide a detailed progress on the solution
of the memory-leak

The test consists doing 100 navigations between 2 pages, as the image
below suggest

<img width="876" height="502" alt="image"
src="https://github.com/user-attachments/assets/e9e80768-dd40-4445-9fc8-90469579236c"
/>


Running the gc-dump on the desired objects this is what I found.

> BaseLine is the dump when the app starts.

| | | | | |
| ------------------------------------ | ------- | ------------ |
-------------- | ------------------------ |
| Object Type | Count | Size (Bytes) | Expected Count | Status |
| **Page2** | **100** | 84,000 | 1 | ❌ **LEAKED** (99 extra) |
| **PageHandler** | **103** | 9,888 | 4 | ❌ **LEAKED** (99 extra) |
| **StackNavigationManager** | **102** | 16,320 | 1 | ❌ **LEAKED** (101
extra) |
| **StackNavigationManager.Callbacks** | **102** | 5,712 | 1 | ❌
**LEAKED** (101 extra) |
| **NavigationViewFragment** | **102** | 5,712 | ~2 | ❌ **LEAKED** (100
extra) |

So the first fix was to call `Disconnect` handler, on the
`previousDetail` during the `FlyoutPage.Detail_set`. The PageChanges and
Navigated events will not see this, since this `set` is not considered a
navigation in .Net Maui.

After that we see the following data

| | | | | |
| ------------------------------------ | ------- | ------------ |
---------------------- | ------------ |
| Object Type | Count | Size (Bytes) | vs Baseline | Status |
| **Page2** | **100** | 84,000 | Same | ❌ **LEAKED** |
| **PageHandler** | **103** | 9,888 | Same | ❌ **LEAKED** |
| **StackNavigationManager** | **102** | 16,320 | Same | ❌ **LEAKED** |
| **StackNavigationManager.Callbacks** | **1** | 56 | ✅ **FIXED!** (was
102) | ✅ **Good!** |
| **NavigationViewFragment** | **102** | 5,712 | Same | ❌ **LEAKED** |

So, calling the Disconnect handler will fix the leak at
`StackNavigationManager.Callbacks`. Next step was to investigate the
`StackNavigationManager` and see what's holding it.

On `StackNavigationManager` I see lot of object that should be cleaned
up in order to release other references from it. After cleaning it up
the result is

|   |   |   |   |   |
|---|---|---|---|---|
|Object Type|Count|Size (Bytes)|vs Baseline|Status|
|**Page2**|**1**|840|✅ **FIXED!** (was 100)|✅ **Perfect!**|
|**PageHandler**|**4**|384|✅ **FIXED!** (was 103)|✅ **Perfect!**|
|**StackNavigationManager**|**102**|16,320|❌ Still leaking (was 102)|❌
**Unchanged**|
|**StackNavigationManager.Callbacks**|**1**|56|✅ Fixed (was 102)|✅
**Good!**|
|**NavigationViewFragment**|**102**|5,712|❌ Still leaking (was 102)|❌
**Unchanged**|

So something is still holding the `StackNavigationManager` and
`NavigationViewFragment` so I changed the approach and found that
`NavigationViewFragment` is holding everything and after fixing that,
cleaning it up on `Destroy` method. here's the result

|   |   |   |   |   |
|---|---|---|---|---|
|Object Type|Count|Size (Bytes)|vs Previous|Status|
|**Page2**|**1**|840|✅ Same|✅ **Perfect!**|
|**PageHandler**|**4**|384|✅ Same|✅ **Perfect!**|
|**StackNavigationManager**|**1**|160|🎉 **FIXED!** (was 102)|🎉
**FIXED!**|
|**StackNavigationManager.Callbacks**|**1**|56|✅ Same|✅ **Perfect!**|
|**NavigationViewFragment**|**102**|5,712|⚠️ Still present|⚠️
**Remaining**|

With that there's still the leak of `NavigationViewFragment`, looking at
the graph the something on Android side is holding it, there's no root
into managed objects, as far the gcdump can tell. I tried to cleanup the
`FragmentManager`, `NavController` and so on but without success (maybe
I did it wrong).

There's still one instance of page 2, somehow it lives longer, I don't
think it's a leak object because since its value is 1. For reference the
Page2 graph is
```
Page2 (1 instance)
 └── PageHandler
     └── EventHandler<FocusChangeEventArgs>
         └── IOnFocusChangeListenerImplementor (Native Android)
             └── UNDEFINED

```


Looking into www I found that android caches those Fragments, sadly in
our case we don't reuse them. The good part is each object has only 56
bytes, so it shouldn't be a big deal, I believe we can take the
improvements made by this PR and keep an eye on that, maybe that's fixed
when moved to Navigation3 implementation.
@kubaflo
Copy link
Copy Markdown
Contributor Author

kubaflo commented Apr 1, 2026

Code Review — PR #28713

Independent Assessment

What this changes: Implements IPlatformMeasureInvalidationController on ShellFlyoutHeaderContainer (iOS/MacCatalyst) so that when a child view's measure is invalidated (e.g. header/footer resized), the container recalculates its own size via SizeThatFits and updates its Frame. Propagation is stopped (return false) since the container handles it directly. The test is updated to enable the resize-verification block on iOS.

Inferred motivation: The Shell flyout header/footer didn't respond correctly to dynamic size changes on iOS because measure-invalidation signals from child views were not intercepted and handled by the container — it relied solely on LayoutSubviews, which wasn't triggered reliably on resize.

Reconciliation with PR Narrative

Author claims: Fixes #26397 (inconsistent resize behavior for header/footer on iOS) and #33501.
Agreement/disagreement: Fully agree. The approach uses the IPlatformMeasureInvalidationController propagation pattern (as explicitly requested by PureWeen in the first review round), rather than the older MeasureInvalidated event-subscription pattern. This is the correct modern approach used throughout the codebase.

Findings

⚠️ Medium — Superview null guard missing in InvalidateMeasure (ShellFlyoutHeaderContainer.cs:40)

var size = SizeThatFits(new CGSize(Superview.Frame.Width, double.PositiveInfinity));

Superview can be null during view lifecycle transitions (removal from hierarchy, disposal). The ancestor-propagation loop in ViewExtensions.InvalidateAncestorsMeasures checks that the child's superview is non-null before calling InvalidateMeasure on it, but it does NOT guarantee that the target view's own Superview is non-null. Other implementations in the codebase (e.g. MauiView.InvalidateMeasure) use safe access patterns when touching Superview.

Suggested fix:

bool IPlatformMeasureInvalidationController.InvalidateMeasure(bool isPropagating)
{
    if (Superview is null)
        return false;

    var size = SizeThatFits(new CGSize(Superview.Frame.Width, double.PositiveInfinity));
    Frame = new CGRect(Frame.X, Frame.Y, size.Width, size.Height);
    return false;
}

(This was also flagged by the multi-model consensus review above.)

💡 Low — Test still excludes MacCatalyst (HeaderFooterShellFlyout.cs:71)

The #if was changed from #if ANDROID to #if ANDROID || IOS, but the issue description lists macOS (Mac Catalyst) as also affected. Since IOS and MACCATALYST are separate TFMs in conditional compilation, this resize test block won't run on MacCatalyst. Consider #if ANDROID || IOS || MACCATALYST if the fix is validated there too (the fix file is in the iOS folder and compiles for both iOS and MacCatalyst).

Devil's Advocate

The Superview null concern is real but arguably low-probability in practice — InvalidateMeasure is typically called during active layout when the view is in the hierarchy. However, defensive null guards are cheap and consistent with the codebase's own documented concern (issue #24032 about disposed superviews causing crashes). The one-line guard is worth adding.

On the MacCatalyst test gap: the fix does compile for MacCatalyst (.ios.cs files compile for both), so the runtime fix is present. The test gap is minor — if MacCatalyst CI coverage for this scenario exists elsewhere, it's fine.

Verdict: NEEDS_CHANGES

Confidence: high
Summary: The approach is correct and follows the established IPlatformMeasureInvalidationController pattern as requested by the maintainer. CI is fully green. The one required change is adding a null guard on Superview before accessing Superview.Frame.Width — this is a one-line fix that prevents a potential NullReferenceException during view lifecycle transitions.

@kubaflo
Copy link
Copy Markdown
Contributor Author

kubaflo commented Apr 1, 2026

🟡 .NET MAUI Review - Changes Suggested

Expand Full Review - e733dc7 - [IOS] Inconsistent Resize Behavior for Header/Footer - fix

Independent Assessment

What this changes: Implements IPlatformMeasureInvalidationController on ShellFlyoutHeaderContainer (iOS/MacCatalyst) so that when a child view's measure is invalidated (e.g. header/footer resized), the container recalculates its own size via SizeThatFits and updates its Frame. Propagation is stopped (return false) since the container handles it directly. The test is updated to enable the resize-verification block on iOS.

Inferred motivation: The Shell flyout header/footer didn't respond correctly to dynamic size changes on iOS because measure-invalidation signals from child views were not intercepted and handled by the container — it relied solely on LayoutSubviews, which wasn't triggered reliably on resize.

Reconciliation with PR Narrative

Author claims: Fixes #26397 (inconsistent resize behavior for header/footer on iOS) and #33501.
Agreement/disagreement: Fully agree. The approach uses the IPlatformMeasureInvalidationController propagation pattern (as explicitly requested by PureWeen in the first review round), rather than the older MeasureInvalidated event-subscription pattern. This is the correct modern approach used throughout the codebase.

Findings

⚠️ Medium — Superview null guard missing in InvalidateMeasure (ShellFlyoutHeaderContainer.cs:40)

var size = SizeThatFits(new CGSize(Superview.Frame.Width, double.PositiveInfinity));

Superview can be null during view lifecycle transitions (removal from hierarchy, disposal). The ancestor-propagation loop in ViewExtensions.InvalidateAncestorsMeasures checks that the child's superview is non-null before calling InvalidateMeasure on it, but it does NOT guarantee that the target view's own Superview is non-null. Other implementations in the codebase (e.g. MauiView.InvalidateMeasure) use safe access patterns when touching Superview.

Suggested fix:

bool IPlatformMeasureInvalidationController.InvalidateMeasure(bool isPropagating)
{
    if (Superview is null)
        return false;

    var size = SizeThatFits(new CGSize(Superview.Frame.Width, double.PositiveInfinity));
    Frame = new CGRect(Frame.X, Frame.Y, size.Width, size.Height);
    return false;
}

(This was also flagged by the multi-model consensus review above.)

💡 Low — Test still excludes MacCatalyst (HeaderFooterShellFlyout.cs:71)

The #if was changed from #if ANDROID to #if ANDROID || IOS, but the issue description lists macOS (Mac Catalyst) as also affected. Since IOS and MACCATALYST are separate TFMs in conditional compilation, this resize test block won't run on MacCatalyst. Consider #if ANDROID || IOS || MACCATALYST if the fix is validated there too (the fix file is in the iOS folder and compiles for both iOS and MacCatalyst).

Devil's Advocate

The Superview null concern is real but arguably low-probability in practice — InvalidateMeasure is typically called during active layout when the view is in the hierarchy. However, defensive null guards are cheap and consistent with the codebase's own documented concern (issue #24032 about disposed superviews causing crashes). The one-line guard is worth adding.

On the MacCatalyst test gap: the fix does compile for MacCatalyst (.ios.cs files compile for both), so the runtime fix is present. The test gap is minor — if MacCatalyst CI coverage for this scenario exists elsewhere, it's fine.

Verdict: NEEDS_CHANGES

Confidence: high
Summary: The approach is correct and follows the established IPlatformMeasureInvalidationController pattern as requested by the maintainer. CI is fully green. The one required change is adding a null guard on Superview before accessing Superview.Frame.Width — this is a one-line fix that prevents a potential NullReferenceException during view lifecycle transitions.

rmarinho and others added 7 commits April 2, 2026 12:24
…34277)

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

## Summary

Adds the `maui device list` command specification to the existing CLI
design document (`docs/design/cli.md`). This command provides unified,
cross-platform device enumeration without requiring a project context.

See [PR dotnet#33865](dotnet#33865) for the full
DevTools spec.

## What is added

### Command: `maui device list [--platform <p>] [--json]`

Lists connected devices, running emulators, and available simulators
across all platforms in a single call.

### Two approaches analysis

The spec analyzes two discovery approaches and recommends the
project-free one:

| | MSBuild (`dotnet run --list-devices`) | Native CLI (`maui device
list`) |
|---|---|---|
| Project required | Yes | **No** |
| Cross-platform | One TFM at a time | All platforms at once |
| Speed | Slower (MSBuild eval) | Fast (<2s) |
| ID compatibility | Source of truth | Same native IDs |

### Scenarios requiring project-free discovery

1. AI agent bootstrapping (no `.csproj` yet)
2. IDE startup (device picker before project loads)
3. Environment validation ("can I see my phone?")
4. CI pipeline setup (check emulator before build)
5. Multi-project solutions (unified view)
6. Cross-platform overview (all devices at once)

### Recommended approach

`maui device list` uses direct native tool invocation (`adb devices`,
`simctl list`, `devicectl list`). Device IDs are compatible with `dotnet
run --device`, making them complementary:

```
maui device list          →  "What devices exist on this machine?"
dotnet run --list-devices →  "What devices can run this project?"
```

### Other changes

- Added references to `ComputeAvailableDevices` MSBuild targets in
[dotnet/android](https://github.com/dotnet/android) and
[dotnet/macios](https://github.com/dotnet/macios)
- Updated AI agent workflow example to include device discovery step
- Fixed AppleDev.Tools reference (xcdevice → devicectl)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…otnet#34727)

## Description

Fixes dotnet#34726

The XAML source generator interpolates `x:Key` values directly into
generated C# string literals without escaping special characters. If an
`x:Key` contains a double quote (`"`), backslash (`\`), or control
character, the generated C# is syntactically invalid.

## Changes

- **`SetPropertyHelpers.cs`** — Escape the `x:Key` value via
`CSharpExpressionHelpers.EscapeForString()` before interpolating into
the generated `resources["..."] = ...` assignment.
- **`KnownMarkups.cs`** — Same fix for `DynamicResource` key emission
(`new DynamicResource("...")`).
- **`CSharpExpressionHelpers.cs`** — Changed `EscapeForString` from
`private static` to `internal static` so it can be reused from
`SetPropertyHelpers` and `KnownMarkups`.

## Test

Added `Maui34726.xaml` / `.xaml.cs` XAML unit test with `x:Key` values
containing double quotes and backslashes:
- **SourceGen path**: Verifies the generated code compiles without
diagnostics
- **Runtime/XamlC paths**: Verifies the resources are accessible by
their original (unescaped) key names

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… to bool

The IPlatformMeasureInvalidationController interface requires InvalidateMeasure to return bool, not void.

Returns false to stop propagation since we're handling the resize directly by recalculating size and updating the frame.
…yst test

- Add null-conditional on Superview in InvalidateMeasure to prevent
  NullReferenceException during view lifecycle transitions
- Enable header/footer resize test for MacCatalyst since the fix
  applies to both iOS and MacCatalyst

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kubaflo kubaflo force-pushed the Inconsistent-Resize-Behavior-for-Header/Footer branch from e733dc7 to 9663717 Compare April 2, 2026 13:42
@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented Apr 2, 2026

🚦 Gate - Test Before and After Fix

📊 Expand Full Gate9663717 · Address review feedback: add Superview null guard and enable MacCatalyst test

Gate Result: ✅ PASSED

Platform: IOS · Base: main · Merge base: 720a9d4a

Test Without Fix (expect FAIL) With Fix (expect PASS)
🖥️ HeaderFooterShellFlyout HeaderFooterShellFlyout ✅ FAIL — 212s ✅ PASS — 89s
🔴 Without fix — 🖥️ HeaderFooterShellFlyout: FAIL ✅ · 212s
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 483 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 1.17 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 9.63 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 9.84 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 9.85 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 9.85 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 9.86 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 9.87 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 9.85 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 9.88 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 9.86 sec).
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-ios26.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.Foldable -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Foldable.dll
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll
  Detected signing identity:
    Code Signing Key: "" (-)
    Provisioning Profile: "" () - no entitlements
    Bundle Id: com.microsoft.maui.uitests
    App Id: com.microsoft.maui.uitests
  Controls.TestCases.HostApp -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-ios/iossimulator-arm64/Controls.TestCases.HostApp.dll
  Optimizing assemblies for size may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink
  Optimizing assemblies for size. This process might take a while.

Build succeeded.

/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
    1 Warning(s)
    0 Error(s)

Time Elapsed 00:01:43.45
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 823 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 834 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 899 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 897 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 902 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 220 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 1.3 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 447 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 1.86 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 1.94 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 2.42 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 2.88 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.iOS.Tests/Controls.TestCases.iOS.Tests.csproj (in 2.9 sec).
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Controls.CustomAttributes -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  UITest.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  VisualTestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  UITest.NUnit -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  UITest.Appium -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  VisualTestUtils.MagickNet -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Analyzers -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.iOS.Tests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.04]   Discovering: Controls.TestCases.iOS.Tests
[xUnit.net 00:00:00.13]   Discovered:  Controls.TestCases.iOS.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
   NUnit3TestExecutor discovered 2 of 2 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 4/2/2026 8:18:33 AM FixtureSetup for HeaderFooterShellFlyout(iOS)
>>>>> 4/2/2026 8:18:36 AM AFlyoutTests Start
>>>>> 4/2/2026 8:18:40 AM AFlyoutTests Stop
>>>>> 4/2/2026 8:18:40 AM Log types: syslog, crashlog, performance, safariConsole, safariNetwork, server
  Failed AFlyoutTests [4 s]
  Error Message:
     Assert.That(headerSizeSmall2.Height, Is.EqualTo(headerSizeSmall.Height))
  Expected: 17
  But was:  200

  Stack Trace:
     at Microsoft.Maui.TestCases.Tests.Issues.HeaderFooterShellFlyout.AFlyoutTests() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/HeaderFooterShellFlyout.cs:line 86

1)    at Microsoft.Maui.TestCases.Tests.Issues.HeaderFooterShellFlyout.AFlyoutTests() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/HeaderFooterShellFlyout.cs:line 86


>>>>> 4/2/2026 8:18:40 AM FlyoutHeaderWithZeroMarginShouldHaveNoY Start
>>>>> 4/2/2026 8:18:41 AM FlyoutHeaderWithZeroMarginShouldHaveNoY Stop
  Passed FlyoutHeaderWithZeroMarginShouldHaveNoY [526 ms]
NUnit Adapter 4.5.0.0: Test execution complete

Test Run Failed.
Total tests: 2
     Passed: 1
     Failed: 1
 Total time: 1.0431 Minutes

🟢 With fix — 🖥️ HeaderFooterShellFlyout: PASS ✅ · 89s
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 316 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 329 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 331 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 368 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 380 ms).
  6 of 11 projects are up-to-date for restore.
/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0-ios26.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0-ios26.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0-ios26.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Microsoft.AspNetCore.Components.WebView.Maui -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-ios26.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Maps.dll
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Xaml.dll
  Controls.Foldable -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-ios26.0/Microsoft.Maui.Controls.Foldable.dll
  Detected signing identity:
    Code Signing Key: "" (-)
    Provisioning Profile: "" () - no entitlements
    Bundle Id: com.microsoft.maui.uitests
    App Id: com.microsoft.maui.uitests
  Controls.TestCases.HostApp -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-ios/iossimulator-arm64/Controls.TestCases.HostApp.dll
  Optimizing assemblies for size may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink
  Optimizing assemblies for size. This process might take a while.

Build succeeded.

/Users/cloudtest/vss/_work/1/s/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.0/26.0.11017/targets/Xamarin.Shared.Sdk.targets(309,3): warning : RuntimeIdentifier was set on the command line, and will override the value for RuntimeIdentifiers set in the project file. [/Users/cloudtest/vss/_work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-ios]
    1 Warning(s)
    0 Error(s)

Time Elapsed 00:00:44.56
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/BindingSourceGen/Controls.BindingSourceGen.csproj (in 358 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 360 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 360 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 374 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 391 ms).
  8 of 13 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Controls.CustomAttributes -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13724782
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  UITest.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  VisualTestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  UITest.Appium -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.NUnit -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  VisualTestUtils.MagickNet -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Analyzers -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.iOS.Tests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.04]   Discovering: Controls.TestCases.iOS.Tests
[xUnit.net 00:00:00.12]   Discovered:  Controls.TestCases.iOS.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.TestCases.iOS.Tests/Debug/net10.0/Controls.TestCases.iOS.Tests.dll
   NUnit3TestExecutor discovered 2 of 2 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 4/2/2026 8:20:03 AM FixtureSetup for HeaderFooterShellFlyout(iOS)
>>>>> 4/2/2026 8:20:06 AM AFlyoutTests Start
>>>>> 4/2/2026 8:20:10 AM AFlyoutTests Stop
  Passed AFlyoutTests [4 s]
>>>>> 4/2/2026 8:20:10 AM FlyoutHeaderWithZeroMarginShouldHaveNoY Start
>>>>> 4/2/2026 8:20:11 AM FlyoutHeaderWithZeroMarginShouldHaveNoY Stop
  Passed FlyoutHeaderWithZeroMarginShouldHaveNoY [553 ms]
NUnit Adapter 4.5.0.0: Test execution complete

Test Run Successful.
Total tests: 2
     Passed: 2
 Total time: 19.3710 Seconds

📁 Fix files reverted (8 files)
  • eng/pipelines/ci-copilot.yml
  • src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutHeaderContainer.cs
  • src/Controls/src/Core/FlyoutPage/FlyoutPage.cs
  • src/Controls/src/SourceGen/CSharpExpressionHelpers.cs
  • src/Controls/src/SourceGen/KnownMarkups.cs
  • src/Controls/src/SourceGen/SetPropertyHelpers.cs
  • src/Core/src/Handlers/FlyoutView/FlyoutViewHandler.Android.cs
  • src/Core/src/Platform/Android/Navigation/NavigationViewFragment.cs

New files (not reverted):

  • github-merge-flow-release-11.jsonc

@MauiBot MauiBot added 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 and removed s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-fix-win AI found a better alternative fix than the PR labels Apr 2, 2026
Inconsistent Resize Behavior for Header/Footer - fix

Fix compilation error: Change InvalidateMeasure return type from void to bool

The IPlatformMeasureInvalidationController interface requires InvalidateMeasure to return bool, not void.

Returns false to stop propagation since we're handling the resize directly by recalculating size and updating the frame.

Update PR fix test result - Gate validated it

Finished pr review
@kubaflo kubaflo changed the base branch from main to inflight/current April 2, 2026 19:21
@kubaflo kubaflo merged commit 46905f8 into dotnet:inflight/current Apr 2, 2026
7 of 17 checks passed
PureWeen pushed a commit that referenced this pull request Apr 2, 2026
- Replace non-existent PR numbers (#34000, #33500, #33000, #34100)
  with real merged PRs (#34024, #34727, #31202, #28713, #34723)
- Add "in dotnet/maui" to all prompts to prevent agent asking for repo
- All PRs verified as real merged PRs with actual code changes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-controls-flyout Flyout area-controls-shell Shell Navigation, Routes, Tabs, Flyout platform/ios 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-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Enable Shell Flyout Header/Footer resize tests on iOS/Catalyst [IOS, Mac] Inconsistent Resize Behavior for Header/Footer

8 participants