[windows] Fixed Rapid change of selected tab results in crash.#33113
[windows] Fixed Rapid change of selected tab results in crash.#33113PureWeen merged 5 commits intodotnet:inflight/currentfrom
Conversation
There was a problem hiding this comment.
Pull request overview
This pull request fixes a Windows-specific crash in TabbedPage when rapidly switching between tabs. The crash occurred because during rapid tab switches, platform views were being reassigned to new WinUI Pages while still attached to previous ones, violating WinUI's constraint that a UI element cannot exist in multiple visual trees simultaneously.
Key Changes
- Added
_displayedPagetracking field to prevent redundant navigation and track which MAUI Page is currently displayed - Added content detachment logic in
NavigateToPageto explicitly clear the previous WinUI Page's ContentPresenter before navigation - Added guard condition in
UpdateCurrentPageContentto skip updates when the requested page is already displayed
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
src/Controls/src/Core/TabbedPage/TabbedPage.Windows.cs |
Implements the fix by adding _displayedPage field, clearing old content before navigation, and adding guard conditions to prevent redundant updates |
src/Controls/tests/DeviceTests/Elements/TabbedPage/TabbedPageTests.Windows.cs |
Adds regression test to verify old ContentPresenter content is cleared during tab switches |
| await CreateHandlerAndAddToWindow<TabbedViewHandler>(tabbedPage, handler => | ||
| { | ||
| var frame = typeof(TabbedPage) | ||
| .GetField("_navigationFrame", BindingFlags.NonPublic | BindingFlags.Instance) |
There was a problem hiding this comment.
The code uses BindingFlags but the required using directive for System.Reflection is missing from the file. This will cause a compilation error. Add 'using System.Reflection;' to the top of the file with the other using statements.
|
/rebase |
08fded8 to
d9a2f6b
Compare
eb56aa1 to
e7ce2dd
Compare
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes #32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 27 commits with various improvements, bug fixes, and enhancements. ## CollectionView - [iOS][CV2] Fix page can be dragged down, and it would cause an extra space between Header and EmptyView text by @devanathan-vaithiyanathan in #31840 <details> <summary>🔧 Fixes</summary> - [I8_Header_and_Footer_Null - The page can be dragged down, and it would cause an extra space between Header and EmptyView text.](#31465) </details> - [iOS] Fixed the Items not displayed properly in CarouselView2 by @Ahamed-Ali in #31336 <details> <summary>🔧 Fixes</summary> - [[iOS] Items are not updated properly in CarouselView2.](#31148) </details> ## Docs - Improve Controls Core API docs by @jfversluis in #33240 ## Editor - [iOS] Fixed an issue where an Editor with a small height inside a ScrollView would cause the entire page to scroll by @Tamilarasan-Paranthaman in #27948 <details> <summary>🔧 Fixes</summary> - [[iOS][Editor] An Editor that has not enough height and resides inside a ScrollView/CollectionView will scroll the entire page](#27750) </details> ## Image - [Android] Image control crashes on Android when image width exceeds height by @KarthikRajaKalaimani in #33045 <details> <summary>🔧 Fixes</summary> - [Image control crashes on Android when image width exceeds height](#32869) </details> ## Mediapicker - [Android 🤖] Add a log telling why the request is cancelled by @pictos in #33295 <details> <summary>🔧 Fixes</summary> - [MediaPicker.PickPhotosAsync throwing TaskCancelledException in net10-android](#33283) </details> ## Navigation - [Android] Fix for App Hang When PopModalAsync Is Called Immediately After PushModalAsync with Task.Yield() by @BagavathiPerumal in #32479 <details> <summary>🔧 Fixes</summary> - [App hangs if PopModalAsync is called after PushModalAsync with single await Task.Yield()](#32310) </details> - [iOS 26] Navigation hangs after rapidly open and closing new page using Navigation.PushAsync - fix by @kubaflo in #32456 <details> <summary>🔧 Fixes</summary> - [[iOS 26] Navigation hangs after rapidly open and closing new page using Navigation.PushAsync](#32425) </details> ## Pages - [iOS] Fix ContentPage BackgroundImageSource not working by @Shalini-Ashokan in #33297 <details> <summary>🔧 Fixes</summary> - [.Net MAUI- Page.BackgroundImageSource not working for iOS](#21594) </details> ## RadioButton - [Issue-Resolver] Fix #33264 - RadioButtonGroup not working with Collection View by @kubaflo in #33343 <details> <summary>🔧 Fixes</summary> - [RadioButtonGroup not working with CollectionView](#33264) </details> ## SafeArea - [Android] Fixed Label Overlapped by Android Status Bar When Using SafeAreaEdges="Container" in .NET MAUI by @NirmalKumarYuvaraj in #33285 <details> <summary>🔧 Fixes</summary> - [SafeAreaEdges works correctly only on the first tab in Shell. Other tabs have content colliding with the display cutout in the landscape mode.](#33034) - [Label Overlapped by Android Status Bar When Using SafeAreaEdges="Container" in .NET MAUI](#32941) - [[MAUI 10] Layout breaks on first navigation (Shell // route) until soft keyboard appears/disappears (Android + iOS)](#33038) </details> ## ScrollView - [Windows, Android] Fix ScrollView Content Not Removed When Set to Null by @devanathan-vaithiyanathan in #33069 <details> <summary>🔧 Fixes</summary> - [[Windows, Android] ScrollView Content Not Removed When Set to Null](#33067) </details> ## Searchbar - Fix Android crash when changing shared Drawable tint on Searchbar by @tritter in #33071 <details> <summary>🔧 Fixes</summary> - [[Android] Crash on changing Tint of Searchbar](#33070) </details> ## Shell - [iOS] - Fix Custom FlyoutIcon from Being Overridden to Default Color in Shell by @prakashKannanSf3972 in #27580 <details> <summary>🔧 Fixes</summary> - [Change the flyout icon color](#6738) </details> - [iOS] Fix Shell NavBarIsVisible updates when switching ShellContent by @Vignesh-SF3580 in #33195 <details> <summary>🔧 Fixes</summary> - [[iOS] Shell NavBarIsVisible is not updated when changing ShellContent](#33191) </details> ## Slider - [C] Fix Slider and Stepper property order independence by @StephaneDelcroix in #32939 <details> <summary>🔧 Fixes</summary> - [Slider Binding Initialization Order Causes Incorrect Value Assignment in XAML](#32903) - [Slider is very broken, Value is a mess when setting Minimum](#14472) - [Slider is buggy depending on order of properties](#18910) - [Stepper Value is incorrectly clamped to default min/max when using bindableproperties in MVVM pattern](#12243) - [[Issue-Resolver] Fix #32903 - Sliderbinding initialization order issue](#32907) </details> ## Stepper - [Windows] Maui Stepper: Clamp minimum and maximum value by @OomJan in #33275 <details> <summary>🔧 Fixes</summary> - [[Windows] Maui Stepper is not clamped to minimum or maximum internally](#33274) </details> - [iOS] Fixed the UIStepper Value from being clamped based on old higher MinimumValue - Candidate PR test failure fix- 33363 by @Ahamed-Ali in #33392 ## TabbedPage - [windows] Fixed Rapid change of selected tab results in crash. by @praveenkumarkarunanithi in #33113 <details> <summary>🔧 Fixes</summary> - [Rapid change of selected tab results in crash on Windows.](#32824) </details> ## Titlebar - [Mac] Fix TitleBar Content Overlapping with Traffic Light Buttons on Latest macOS Version by @devanathan-vaithiyanathan in #33157 <details> <summary>🔧 Fixes</summary> - [TitleBar Content Overlapping with Traffic Light Buttons on Latest macOS Version](#33136) </details> ## Xaml - Fix for Control does not update from binding anymore after MultiBinding.ConvertBack is called by @BagavathiPerumal in #33128 <details> <summary>🔧 Fixes</summary> - [Control does not update from binding anymore after MultiBinding.ConvertBack is called](#24969) - [The issue with the MultiBinding converter with two way binding mode does not work properly when changing the values.](#20382) </details> <details> <summary>🔧 Infrastructure (1)</summary> - Avoid KVO on CALayer by introducing an Apple PlatformInterop by @albyrock87 in #30861 </details> <details> <summary>🧪 Testing (2)</summary> - [Testing] Enable UITest Issue18193 on MacCatalyst by @NafeelaNazhir in #31653 <details> <summary>🔧 Fixes</summary> - [Test Issue18193 was disabled on Mac Catalyst](#27206) </details> - Set the CV2 handlers as the default by @Ahamed-Ali in #33177 </details> <details> <summary>📦 Other (3)</summary> - Update WindowsAppSDK to 1.8 by @mattleibow in #32174 <details> <summary>🔧 Fixes</summary> - [Update to WindowsAppSDK](#30858) </details> - Fix command dependency reentrancy by @simonrozsival in #33129 - Fix SafeArea AdjustPan handling and add AdjustNothing mode tests by @PureWeen via @Copilot in #33354 </details> **Full Changelog**: main...inflight/candidate
…t#33113) ### Root Cause On Windows, `TabbedPage` uses WinUI `Frame` navigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUI `Page` through a `ContentPresenter`. During rapid tab switching, the platform view is reassigned to a new WinUI `Page` while still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash. ### Description of Change Added a `_displayedPage` tracking field to maintain the correct displayed MAUI Page during navigation, allowing `NavigateToPage` to skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’s `ContentPresenter` to explicitly detach the platform view and prevent the “element already has a parent” WinUI error. In `UpdateCurrentPageContent`, a skip guard avoids reassigning content that is already set, while `_displayedPage` is updated only after successful content assignment. Finally, OnHandlerDisconnected resets `_displayedPage` to null to ensure proper cleanup and prevent stale references. ### Issues Fixed Fixes dotnet#32824 Tested the behaviour in the following platforms - [x] Android - [x] Windows - [x] iOS - [x] Mac ### Output Video | Before Issue Fix | After Issue Fix | |------------------|-----------------| | <img width="350" alt="withoutfix" src="https://github.com/user-attachments/assets/4ae17a81-a399-4cd6-856d-ca4938cb683b" /> | <img width="350" alt="withfix" src="https://github.com/user-attachments/assets/5927a164-22d8-45bc-a910-003bfbc1927a" /> |
Root Cause
On Windows,
TabbedPageuses WinUIFramenavigation to display each tab’s content. Each tab’s platform view (native UI element) is hosted inside a WinUIPagethrough aContentPresenter.During rapid tab switching, the platform view is reassigned to a new WinUI
Pagewhile still attached to the previous one. WinUI does not allow a UI element to exist in two visual trees simultaneously, which causes the crash.Description of Change
Added a
_displayedPagetracking field to maintain the correct displayed MAUI Page during navigation, allowingNavigateToPageto skip early if the requested page is already displayed and avoid redundant navigation. The method also now clears the previous WinUI Page’sContentPresenterto explicitly detach the platform view and prevent the “element already has a parent” WinUI error. InUpdateCurrentPageContent, a skip guard avoids reassigning content that is already set, while_displayedPageis updated only after successful content assignment. Finally, OnHandlerDisconnected resets_displayedPageto null to ensure proper cleanup and prevent stale references.Issues Fixed
Fixes #32824
Tested the behaviour in the following platforms
Output Video