[Windows] TabbedPage: Refresh layout when NavigationView size changes#26217
[Windows] TabbedPage: Refresh layout when NavigationView size changes#26217BagavathiPerumal wants to merge 6 commits intodotnet:mainfrom
Conversation
|
/azp run |
This comment was marked as outdated.
This comment was marked as outdated.
|
@PureWeen / @jsuarezruiz, We have analysed the test case (Issue1323Test) failure and found that the issue was caused by a button alignment-related issue. Previously, the button inside the page, which was added as a child within the TabbedPage, was not properly aligned in the center. In this test case, the button was added directly as the content of the page without any additional properties. However, when the page was added as a child page within the TabbedPage, the button was not properly centered. After the fix, the button inside the page, which was added as a child in the TabbedPage, was properly aligned in the center of the page. The fix involved calling this.InvalidateMeasure(), which triggered a layout recalculation. This allowed the element within the TabbedPage to be measured and arranged correctly during the subsequent layout cycle. As a result, the button was properly aligned in the center of the page. Previously, the layout measurements were not recalculated, which caused the button to be misaligned on the page. Based on the current behavior after the fix, can we resave the current snapshot as the expected snapshot for this test case (Issue1323Test). Button Alignment in the Page (Output image from the simple sample): Page added as Child in the TabbedPge(Output image from the simple sample): Testcase Image (Before Fix): Current Testcase Image (After Fix): |
| { | ||
| if (_navigationView != null) | ||
| { | ||
| this.InvalidateMeasure(); |
There was a problem hiding this comment.
If you remove the call to this.Arrange and leave this.InvalidateMeasure does this all still work?
The call to arrange inside the SizeChanged method here doesn't seem correct.
Also, can you add a test?
There was a problem hiding this comment.
@PureWeen, I have implemented the suggested changes, tested the fix across all basic scenarios, and also ran UI tests.
Testcase: The test case cannot be created for this scenario as resizing the window to a minimized state is not feasible during testing. Therefore, we have not added a test case for this scenario. Could you suggest alternative ways to address this, since resizing the window to a minimized state isn't possible during testing.
There was a problem hiding this comment.
Do you need to resize the Window or minimize and maximize it?
There was a problem hiding this comment.
@jsuarezruiz, The issue occurs only when resizing the window. Could you please share your suggestions on how to resolve it.
There was a problem hiding this comment.
@PureWeen, The Arrange() call in the NavigationView SizeChanged method is necessary to prevent test failures. Without this change, the ChangingToNewMauiContextDoesntCrash test consistently fails with a timeout exception.
|
/azp run |
This comment was marked as off-topic.
This comment was marked as off-topic.
1 similar comment
|
Azure Pipelines successfully started running 3 pipeline(s). |
|
@BagavathiPerumal I've tried your pr with my app and it does appear to fix the issue, thanks! |
@Mark-NC001, Thank you so much for taking the time to test the PR with your app. We're truly glad to hear that it resolves the issue. |
| { | ||
| if (_navigationView != null) | ||
| { | ||
| this.InvalidateMeasure(); |
There was a problem hiding this comment.
Do you need to resize the Window or minimize and maximize it?
@jsuarezruiz, It looks expected behavior, as we already mentioned here, can we resave the current snapshot as the expected snapshot for this test case (Issue1323Test). |
|
/rebase |
dd46dc2 to
ea5714d
Compare
|
/azp run |
|
Azure Pipelines successfully started running 3 pipeline(s). |
jsuarezruiz
left a comment
There was a problem hiding this comment.
Could be possible to include a test case for this changes?
In Appium, can minimize and maximize the Window (even change the Window size) using:
app.Driver.Manage().Window.Maximize();
app.Driver.Manage().Window.Maximize();
Let me know if can help in someway.
@jsuarezruiz, As suggested, I have tried recreating the test case using Appium but was unable to do so for this scenario. A NotImplementedException occurs when attempting to set the size value using testApp.Driver.Manage().Window.Size. Exception details: System.NotImplementedException: Unhandled endpoint: /session/2EDC486C-4A59-4E60-8C80-3EC866B72868/window/rect -- http://127.0.0.1:10100/ with parameters { Code: I also tried creating a test case based on a button click to change the window size, but this approach did not reproduce the issue. The issue only occurs when resizing the window by dragging. Could you please share your suggestions on how to resolve it. |
There was a problem hiding this comment.
There are some TabbedPage Windows tests failing.
Issue1323Test
Snapshot different than baseline: Issue1323Test.png (0.90% difference)

(in red, the differences)
TestPageDoesntCrash
at UITest.Appium.HelperExtensions.Tap(IUIElement element) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 302
at UITest.Appium.HelperExtensions.Tap(IApp app, IQuery query) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 38
at UITest.Appium.HelperExtensions.TapMoreButton(IApp app) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2261
at Microsoft.Maui.TestCases.Tests.Issues.Issue2809.TestPageDoesntCrash() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/Issue2809.cs:line 19
at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
Could you review if are related with the changes?
|
/rebase |
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 26217Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 26217" |
I’ve reviewed and updated the changes based on the latest findings. Specifically:
|
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
kubaflo
left a comment
There was a problem hiding this comment.
Please review the ai's summary :)
I have reviewed the AI summary. The Arrange() call in the NavigationView.SizeChanged method is necessary to prevent test failures. Without this change, the ChangingToNewMauiContextDoesntCrash test consistently fails with a TimeoutException. |
#34575) <!-- 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 Windows platform support to the `maui-copilot` CI pipeline (AzDO definition 27723), enabling Copilot PR reviews on Windows-targeted PRs. ### Changes **`eng/pipelines/ci-copilot.yml`** - Add `catalyst` and `windows` to Platform parameter values - Add per-platform pool selection (`androidPool`, `iosPool`, `macPool`, `windowsPool`) - Skip Xcode, Android SDK, simulator setup for Windows/Catalyst - Add Windows-specific "Set screen resolution" step (1920x1080) - Add MacCatalyst-specific "Disable Notification Center" step - Fix `sed` command for `Directory.Build.Override.props` on Windows (Git Bash uses GNU sed) - Handle Copilot CLI PATH detection on Windows vs Unix - Change `script:` steps to `bash:` for cross-platform consistency **`.github/scripts/Review-PR.ps1`** - Add `catalyst` to ValidateSet for Platform parameter **`.github/scripts/BuildAndRunHostApp.ps1`** - Add Windows test assembly directory for artifact collection **`.github/scripts/post-ai-summary-comment.ps1` / `post-pr-finalize-comment.ps1`** - Various improvements for cross-platform comment posting ### Validation Successfully ran the pipeline with `Platform=windows` on multiple Windows-specific PRs: - PR #27713 — ✅ Succeeded - PR #34337 — ✅ Succeeded - PR #26217, #27609, #27880, #28617, #29927, #30068 — Triggered and running --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/rebase |
e4a80c4 to
4eb69f6
Compare
🏷️ Test Categories for Regression DetectionNo UI Test Categories
Pipeline filter: Device Test Categories
Recommendation: Run device tests: Yes — Windows-specific TabbedPage platform handler code changed. 🚀 Run Targeted Tests on Existing PipelinesBoth UI Tests — trigger
Device Tests — trigger
When triggered without parameters (e.g., by normal PR push), all categories run as usual. 📁 Changed files (7)Test/snapshot files (6):
Source files (1):
|
🚦 Gate — Test Before and After Fix
🚦 Gate Session —
|
🤖 AI Summary
📊 Review Session —
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #26217 | Add InvalidateMeasure() before Arrange(), use e.NewSize directly |
⏳ PENDING | TabbedPage.Windows.cs + 6 snapshots |
Original PR |
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix (opus-4.6) | InvalidateMeasure() alone — no Arrange() |
✅ PASS (59/59) | TabbedPage.Windows.cs |
Simplest; directly addresses PureWeen's concern |
| 2 | try-fix (sonnet-4.6) | Unsubscribe SizeChanged after OnApplyTemplateFinished; trust layout pipeline |
✅ PASS (59/59) | TabbedPage.Windows.cs |
Addresses lifecycle bug but may not fix actual window-resize scenario |
| 3 | try-fix (gpt-5.3-codex) | Remove frame-equality guard in FrameworkElementExtensions.Arrange globally |
❌ FAIL (53/59) | FrameworkElementExtensions.cs |
Too broad — caused visual regressions in 6 snapshot tests |
| 4 | try-fix (gpt-5.4) | ForceLayout() in OnNavigationViewSizeChanged |
✅ PASS (59/59) | TabbedPage.Windows.cs |
ForceLayout() is a legacy/deprecated API path |
| PR | PR #26217 | InvalidateMeasure() + Arrange(new Rect(0,0,w,h)) |
⏳ Gate skipped | TabbedPage.Windows.cs + 6 snapshots |
Original PR; has unresolved reviewer concern |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 2 | NO NEW IDEAS | Design space exhausted; noted possible combination of Attempt 1 + 2 |
Exhausted: Yes
Selected Fix: Attempt 1 — InvalidateMeasure() alone
Reason: Simplest passing alternative. Directly addresses PureWeen's concern. InvalidateMeasure() triggers the layout system to re-measure and re-arrange naturally — no questionable Arrange() in a SizeChanged handler. Passes all 59 TabbedPage tests. The PR should be updated to remove the Arrange() call.
Note on Attempt 2: While it passed tests, it unsubscribes the SizeChanged handler after initialization — which may mean actual runtime window-resize events are not handled. Snapshot tests only test static layout. Attempt 1 is safer as it keeps the handler for real resizes.
📋 Report — Final Recommendation
⚠️ Final Recommendation: REQUEST CHANGES
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | ✅ COMPLETE | 3 linked issues (#26103, #11402, #20028); Windows-only layout bug |
| Gate | No tests detected in PR (window resize not automatable per author) | |
| Try-Fix | ✅ COMPLETE | 4 attempts; 3 passing, 1 failing |
| Report | ✅ COMPLETE |
Summary
This PR fixes a long-standing Windows TabbedPage layout bug where resizing the window causes incorrect layout measurements (ScrollView can't scroll, content clipped, Grid overflows). The core fix is in OnNavigationViewSizeChanged in TabbedPage.Windows.cs. The fix is directionally correct, but an alternative approach found by exploration is simpler and directly addresses the main unresolved reviewer concern.
Root Cause
OnNavigationViewSizeChanged called this.Arrange(_navigationView) via FrameworkElementExtensions.Arrange(IView, FrameworkElement), which:
- Uses stale
ActualWidth/Heightvalues (not yet updated at the time of the event) - Has a "no-op if unchanged" guard — silently skips the arrange if
view.Framealready equals the stale rect
The result: layout measurements are never invalidated before the next arrange pass, so child views (ScrollView, Grid) render with the old dimensions.
Fix Quality
PR's approach: Adds this.InvalidateMeasure() before changing this.Arrange(_navigationView) to this.Arrange(new Rect(0, 0, e.NewSize.Width, e.NewSize.Height)).
Concerns with PR's fix:
- Unresolved reviewer concern (PureWeen): "The call to
arrangeinside theSizeChangedmethod here doesn't seem correct. If you remove the call tothis.Arrangeand leavethis.InvalidateMeasuredoes this all still work?" — this thread is still open. - Try-Fix confirms PureWeen is right: Attempt 1 (
InvalidateMeasure()alone, noArrange()) passes all 59 TabbedPage tests. The explicitArrange(new Rect(...))in aSizeChangedhandler is unnecessary. - Unconditional Arrange: The PR removes the "only if changed" guard, so
Arrangeis called on every resize even if size hasn't changed — minor performance concern. - 6 snapshot files updated — expected, since the layout fix changes how the TabbedPage renders. The updates appear visually correct.
- No new tests — Gate was skipped. The author reasonably argues window resize can't be automated.
Recommended Change
The PR should be simplified to:
void OnNavigationViewSizeChanged(object sender, SizeChangedEventArgs e)
{
if (_navigationView != null)
this.InvalidateMeasure();
}This is the minimal fix that:
- Directly addresses PureWeen's concern
- Removes the questionable
Arrange()call from aSizeChangedhandler - Passes all 59 TabbedPage UI tests (verified empirically)
- Trusts WinUI's layout system to handle re-arrangement after measure invalidation
Try-Fix Comparison
See try-fix/content.md for full table. Summary: InvalidateMeasure() alone (Attempt 1) is the best alternative — simpler, equally effective, answers the open reviewer question.
Selected Fix: Attempt 1 (not PR's fix)
📊 Review Session — 4eb69f6 · fix-26103-Resaved the test image. · 2026-04-12 15:56 UTC
🔍 Pre-Flight — Context & Validation
Issue: #26103 - TabbedPage - ScrollView not allowing scrolling when it should
Related Issues: #11402 - TabbedPage app on resize hides page bottom content; #20028 - TabbedPage layout misalignment on window resize
PR: #26217 - [Windows] TabbedPage: Refresh layout when NavigationView size changes
Platforms Affected: Windows (fix), snapshot updates affect Windows UI tests
Files Changed: 1 implementation, 6 test snapshots (no new tests added)
Gate Result:
Key Findings
- Root cause:
OnNavigationViewSizeChangedonly calledthis.Arrange(_navigationView)without first invalidating the measure cache, so the layout pass used stale measurements after a window resize, causing scroll content to be clipped. - Fix: The PR adds
this.InvalidateMeasure()before the existingthis.Arrange(_navigationView)call inside the null-guard block. - Concern from reviewer (PureWeen): Asked whether
Arrange()is even needed and whetherInvalidateMeasure()alone suffices. The PR author claims removingArrange()causes theChangingToNewMauiContextDoesntCrashtest to time out. This claim has not been independently verified. - Comment from inline reviewer (jsuarezruiz): Suggested adding a test using Appium
Window.Maximize()/Window.Minimize()to reproduce. Author attempted but could not successfully reproduce via Appium test. - Reporter confirmed fix works: Issue reporter (Mark-NC001) tested PR and confirmed ScrollView now scrolls to the bottom correctly.
- No new tests added: PR author argues window resize is not automatable. Gate skipped since no tests present.
- Snapshot changes: 6 TabbedPage Windows snapshot baselines were updated because the layout is now more correct (items better aligned). This is an expected side-effect of the fix.
- Inline comments: One unresolved review thread — PureWeen's question about whether
Arrange()is still needed. - Prior agent reviews: None (only an AI summary posted by the PR author, not an agent review).
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #26217 | Add InvalidateMeasure() before existing Arrange(_navigationView) call in OnNavigationViewSizeChanged |
TabbedPage.Windows.cs + 6 snapshots |
Original PR; Arrange() kept to prevent test timeout per author |
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix (claude-opus-4.6) | Replace this.Arrange(_navigationView) with _navigationView.InvalidateMeasure() to let WinUI's layout cycle handle re-arrangement |
TabbedPage.Windows.cs |
Compiles cleanly, unit tests pass; device tests unavailable | |
| 2 | try-fix (claude-sonnet-4.6) | Directly measure+arrange _displayedPage using _navigationFrame.ActualWidth/Height (content area dimensions) |
TabbedPage.Windows.cs |
Compiles cleanly; device tests unavailable | |
| 3 | try-fix (gpt-5.3-codex) | Dual invalidation (InvalidateMeasure + InvalidateArrange) on both this and _navigationView, no explicit Arrange() |
TabbedPage.Windows.cs |
Compiles cleanly; device tests unavailable | |
| 4 | try-fix (gpt-5.4) | _displayedPage.InvalidateMeasure() + platform view fallback invalidation |
TabbedPage.Windows.cs |
Compiles cleanly; device tests unavailable | |
| PR | PR #26217 | Add this.InvalidateMeasure() before existing this.Arrange(_navigationView) call in OnNavigationViewSizeChanged |
TabbedPage.Windows.cs + 6 snapshots |
Original PR |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 2 | Yes | Key insight: this.Arrange(_navigationView) uses FrameworkElementExtensions.Arrange (line 184) which has a guard: if (!view.Frame.Equals(rect)). This means if MAUI Frame already matches the current NavigationView dimensions, the arrange is silently skipped. New ideas: (1) Bypass guard with e.NewSize directly calling VisualElement.Arrange(Rect) unconditionally; (2) Defer layout to next dispatcher tick via DispatcherQueue.TryEnqueue; (3) Subscribe to _navigationFrame.SizeChanged instead; (4) Use WinUI _navigationView.UpdateLayout() |
Exhausted: Yes — all 4 models + cross-pollination completed
Key Infrastructure Finding: All Windows device tests (including ChangingToNewMauiContextDoesntCrash) blocked with WindowsAppSDKSelfContained requires a supported Windows architecture. Unit tests pass for all approaches.
Selected Fix: PR #26217 — No attempt could be validated over the PR's fix due to device test infrastructure unavailability. The PR's approach (InvalidateMeasure() + Arrange()) is the most tested fix (reporter confirmed working). However, PureWeen's concern about the Arrange() call inside SizeChanged remains unresolved. The cross-pollination insight about the FrameworkElementExtensions.Arrange guard (line 184) is relevant — if the guard is the real root cause, bypassing it with e.NewSize might be cleaner.
📋 Report — Final Recommendation
⚠️ Final Recommendation: REQUEST CHANGES
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | ✅ COMPLETE | Issue #26103 (Windows TabbedPage ScrollView clipping on resize) + related #11402, #20028 |
| Gate | No tests detected in PR | |
| Try-Fix | 4 attempts, 0 passing — Windows device test infrastructure unavailable (WindowsAppSDKSelfContained requires a supported Windows architecture) |
|
| Report | ✅ COMPLETE |
Selected Fix: PR (no alternative could be validated)
Summary
PR #26217 fixes a Windows-only layout bug where TabbedPage containing a ScrollView fails to correctly update its layout after window resize. The fix adds this.InvalidateMeasure() before the existing this.Arrange(_navigationView) call in OnNavigationViewSizeChanged. This is a 5-line change to TabbedPage.Windows.cs plus 6 updated snapshot baselines.
The fix is confirmed working by the issue reporter. However, there is an unresolved reviewer concern from PureWeen about whether the Arrange() call inside SizeChanged is necessary and correct, and no new automated tests were added.
Root Cause
When the window is resized, the WinUI NavigationView.SizeChanged event fires. The original handler called this.Arrange(_navigationView), which uses the FrameworkElementExtensions.Arrange(IView, FrameworkElement) extension method (defined in FrameworkElementExtensions.cs:184). This extension method:
- Builds a
Rect(0, 0, frameworkElement.ActualWidth, frameworkElement.ActualHeight)from current NavigationView dimensions - Only calls
view.Arrange(rect)if!view.Frame.Equals(rect)(guard to prevent redundant arranges)
The bug: view.Arrange(rect) does NOT call InvalidateMeasure() first. So when the layout pass runs, the MAUI measure cache still contains stale sizes from before the resize. The ScrollView child's DesiredSize is never re-measured with the new window dimensions, causing clipping.
The PR's fix correctly adds this.InvalidateMeasure() before this.Arrange() so that stale measurements are discarded before the arrangement pass runs.
Fix Quality
Strengths:
- ✅ Fix is minimal and targeted (5 lines changed in one method)
- ✅ Addresses the correct root cause (stale measure cache)
- ✅ Confirmed working by issue reporter (Mark-NC001)
- ✅ Snapshot updates are expected and correct (layout is now more accurate)
Concerns requiring author response:
-
❓ Is
this.Arrange(_navigationView)still needed? — PureWeen asked whetherInvalidateMeasure()alone suffices. The PR author claims removingArrange()causesChangingToNewMauiContextDoesntCrashdevice test to time out. This claim should be independently verified. CallingArrange()inside aSizeChangedhandler of the same view is architecturally unusual and could cause layout re-entrancy issues. -
🔍 Consider bypassing the extension method guard — The
FrameworkElementExtensions.Arrangeextension has a frame-equality guard. If the new size matches the MAUIFrame(e.g., when window is restored to its original size), the arrange is silently skipped. A more robust approach may be:this.InvalidateMeasure(); this.Arrange(new Graphics.Rect(0, 0, e.NewSize.Width, e.NewSize.Height));usinge.NewSizefrom the event args to bypass the guard unconditionally. -
⚠️ No new tests — The Gate was skipped because no tests were added. The reviewer (jsuarezruiz) suggested using Appium'sapp.Driver.Manage().Window.Maximize()/Minimize()to test window resize behavior. This is technically feasible and should be explored. -
🧹 Inline code comments — The two inline comments added (
// Ensure TabbedPage layout responds to NavigationView size changes,// Complete layout to fix frame dimensions) do not add significant clarity over the code itself and should follow the repo convention of minimal comments.
Recommendation Details
The fix is functionally correct based on reporter confirmation and code analysis. However, the open reviewer question about Arrange() necessity plus the absence of tests leads to a REQUEST CHANGES recommendation. The author should:
- Address PureWeen's concern about
Arrange()vsInvalidateMeasure()alone with a reproducible test or CI evidence - Consider using
e.NewSizeto bypass the extension guard for robustness - Explore adding a window-resize UI test as jsuarezruiz suggested
- Remove or simplify the inline code comments to match repo style
…to fix scrolling and layout issues.
…ing InvalidateMeasure() and Snapshot resaved.
4eb69f6 to
a9086ab
Compare
…Inline code comments have been removed to align with the repository style.
I’ve reviewed and updated the changes based on the latest findings. Specifically:
|







Root cause
The issue arises because the OnNavigationViewSizeChanged method fails to properly reset the layout measurements before arranging the NavigationView. As a result, the NavigationView does not correctly update its layout in response to size changes, causing misalignment or rendering issues in the ScrollView.
Description of Issue Fix
The fix involves updating the OnNavigationViewSizeChanged() method to include a call to InvalidateMeasure() before arranging the NavigationView. This ensures that the layout is accurately recalculated, allowing the ScrollView and other elements within the TabbedPage to be properly measured and arranged during the subsequent layout cycle. This effectively resolves alignment and rendering issues.
Additionally, the Arrange() call is retained within the SizeChanged handler to prevent test failures, specifically avoiding timeout issues observed in the ChangingToNewMauiContextDoesntCrash test. This combination ensures stable layout behavior while resolving the clipping and scrolling issues that occur after window resizing.
Why Tests were not added:
Regarding the test case: The issue only occurs when resizing the window, so it is not possible to add a test case for the window resizing behavior.
Tested the behavior in the following platforms.
Issues Fixed
Fixes #26103
Fixes #11402
Fixes #20028
Resaved Test snapshots
Resaved the below-mentioned test snapshot because elements in the TabbedPage were not properly aligned before the fix. The layout changes in OnNavigationViewSizeChanged (adding Arrange() after InvalidateMeasure()) now ensure proper element alignment within the TabbedPage.
Output
BeforeFix-TabbedPage-ScrollView.mp4
AfterFix-TabbedPage-ScrollView.mp4