[Windows] FlyoutPage: update CollapseStyle at runtime#29927
Conversation
|
Hey there @@devanathan-vaithiyanathan! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
|
/azp run MAUI-UITests-public |
|
Azure Pipelines successfully started running 1 pipeline(s). |
| @@ -0,0 +1,29 @@ | |||
| # if TEST_FAILS_ON_ANDROID && TEST_FAILS_ON_CATALYST && TEST_FAILS_ON_IOS // It's a Windows specific API issue, so restricting the other platforms | |||
There was a problem hiding this comment.
Because is a platform specific, here can use directly #if WINDOWS. Are not failing on other platforms, just have not sense.
There was a problem hiding this comment.
@jsuarezruiz , Thanks for pointing out. I have modified the changes
a39ee9a to
a1ad2f8
Compare
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 29927Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 29927" |
There was a problem hiding this comment.
Pull request overview
This PR fixes a Windows-specific issue where changing the CollapseStyle property on a FlyoutPage at runtime had no effect. The fix enables dynamic updates to the flyout pane's collapse behavior by adding a property changed callback and mapper implementation.
Key Changes
- Added runtime support for
CollapseStyleproperty changes in Windows FlyoutPage - Implemented property change notification system via
OnCollapseStylePropertyChanged - Added Windows-specific mapper logic to translate
CollapseStylevalues to WinUIPaneDisplayMode
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 6 comments.
| File | Description |
|---|---|
| src/Controls/src/Core/PlatformConfiguration/WindowsSpecific/FlyoutPage.cs | Added propertyChanged callback to CollapseStyleProperty to trigger handler updates when value changes at runtime |
| src/Controls/src/Core/FlyoutPage/FlyoutPage.Mapper.cs | Added Windows-specific mapper for CollapseStyleProperty that sets WinUI NavigationView.PaneDisplayMode based on CollapseStyle value |
| src/Controls/tests/TestCases.HostApp/Issues/Issue18200.cs | Created test page demonstrating dynamic CollapseStyle switching with button toggle functionality |
| src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue18200.cs | Added UI test to verify flyout collapse behavior changes when CollapseStyle is toggled |
| @@ -0,0 +1,79 @@ | |||
| using Microsoft.Maui.Controls.PlatformConfiguration; | |||
| using Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific; | |||
There was a problem hiding this comment.
There's an extra space in the using statement that creates inconsistent formatting with other using statements in the file.
| using Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific; | |
| using Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific; |
|
|
||
| namespace Maui.Controls.Sample.Issues; | ||
|
|
||
| [Issue(IssueTracker.Github, 18200, "Flyout Page SetCollapseStyle doesn't have any change", PlatformAffected.UWP)] |
There was a problem hiding this comment.
The PlatformAffected.UWP value is outdated. MAUI uses Windows (WinUI3) instead of UWP (Universal Windows Platform). This should be PlatformAffected.Windows or simply PlatformAffected.All if testing on all platforms is acceptable.
| [Issue(IssueTracker.Github, 18200, "Flyout Page SetCollapseStyle doesn't have any change", PlatformAffected.UWP)] | |
| [Issue(IssueTracker.Github, 18200, "Flyout Page SetCollapseStyle doesn't have any change", PlatformAffected.Windows)] |
| { | ||
| this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().SetCollapseStyle(CollapseStyle.Partial); | ||
|
|
||
| // Set the flyout page properties | ||
| FlyoutLayoutBehavior = FlyoutLayoutBehavior.Popover; | ||
|
|
||
| // Create the flyout content | ||
| var flyoutPage = new ContentPage | ||
| { | ||
| Title = "Master", | ||
| BackgroundColor = Colors.Blue | ||
| }; | ||
|
|
||
| var page1Button = new Button | ||
| { | ||
| Text = "Page1", | ||
| AutomationId = "FlyoutItem", | ||
| HorizontalOptions = LayoutOptions.Start, | ||
| VerticalOptions = LayoutOptions.Center | ||
| }; | ||
|
|
||
| flyoutPage.Content = new VerticalStackLayout | ||
| { | ||
| Children = { page1Button } | ||
| }; | ||
|
|
||
| // Create the detail content | ||
| var detailPage = new ContentPage | ||
| { | ||
| Title = "Detail", | ||
| BackgroundColor = Colors.LightYellow | ||
| }; | ||
|
|
||
| _button = new Button | ||
| { | ||
| Text = "Change Collapse Style", | ||
| AutomationId = "CollapseStyleButton", | ||
| }; | ||
| _button.Clicked += OnCollapseStyleValueChanged; | ||
|
|
||
| detailPage.Content = new VerticalStackLayout | ||
| { | ||
| Children = { | ||
| new Microsoft.Maui.Controls.Label | ||
| { | ||
| Text = "Welcome to .NET MAUI!", | ||
| TextColor = Colors.Black, | ||
| HorizontalOptions = LayoutOptions.Center, | ||
| VerticalOptions = LayoutOptions.Center | ||
| }, | ||
| _button | ||
| } | ||
| }; | ||
|
|
||
| // Set the flyout and detail pages | ||
| Flyout = flyoutPage; | ||
| Detail = detailPage; | ||
| } | ||
|
|
||
| void OnCollapseStyleValueChanged(object sender, EventArgs e) | ||
| { | ||
| var currentCollapseStyle = this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().GetCollapseStyle(); | ||
| var newCollapseStyle = currentCollapseStyle == CollapseStyle.Full | ||
| ? CollapseStyle.Partial | ||
| : CollapseStyle.Full; | ||
|
|
||
| this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().SetCollapseStyle(newCollapseStyle); | ||
| } |
There was a problem hiding this comment.
[nitpick] According to the MAUI coding guidelines, file indentation should use tabs, but this file uses spaces for indentation (4 spaces). While this might be consistent within the immediate context, the repository standard is to use tabs. Consider running dotnet format to ensure consistent formatting.
| { | |
| this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().SetCollapseStyle(CollapseStyle.Partial); | |
| // Set the flyout page properties | |
| FlyoutLayoutBehavior = FlyoutLayoutBehavior.Popover; | |
| // Create the flyout content | |
| var flyoutPage = new ContentPage | |
| { | |
| Title = "Master", | |
| BackgroundColor = Colors.Blue | |
| }; | |
| var page1Button = new Button | |
| { | |
| Text = "Page1", | |
| AutomationId = "FlyoutItem", | |
| HorizontalOptions = LayoutOptions.Start, | |
| VerticalOptions = LayoutOptions.Center | |
| }; | |
| flyoutPage.Content = new VerticalStackLayout | |
| { | |
| Children = { page1Button } | |
| }; | |
| // Create the detail content | |
| var detailPage = new ContentPage | |
| { | |
| Title = "Detail", | |
| BackgroundColor = Colors.LightYellow | |
| }; | |
| _button = new Button | |
| { | |
| Text = "Change Collapse Style", | |
| AutomationId = "CollapseStyleButton", | |
| }; | |
| _button.Clicked += OnCollapseStyleValueChanged; | |
| detailPage.Content = new VerticalStackLayout | |
| { | |
| Children = { | |
| new Microsoft.Maui.Controls.Label | |
| { | |
| Text = "Welcome to .NET MAUI!", | |
| TextColor = Colors.Black, | |
| HorizontalOptions = LayoutOptions.Center, | |
| VerticalOptions = LayoutOptions.Center | |
| }, | |
| _button | |
| } | |
| }; | |
| // Set the flyout and detail pages | |
| Flyout = flyoutPage; | |
| Detail = detailPage; | |
| } | |
| void OnCollapseStyleValueChanged(object sender, EventArgs e) | |
| { | |
| var currentCollapseStyle = this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().GetCollapseStyle(); | |
| var newCollapseStyle = currentCollapseStyle == CollapseStyle.Full | |
| ? CollapseStyle.Partial | |
| : CollapseStyle.Full; | |
| this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().SetCollapseStyle(newCollapseStyle); | |
| } | |
| { | |
| this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().SetCollapseStyle(CollapseStyle.Partial); | |
| // Set the flyout page properties | |
| FlyoutLayoutBehavior = FlyoutLayoutBehavior.Popover; | |
| // Create the flyout content | |
| var flyoutPage = new ContentPage | |
| { | |
| Title = "Master", | |
| BackgroundColor = Colors.Blue | |
| }; | |
| var page1Button = new Button | |
| { | |
| Text = "Page1", | |
| AutomationId = "FlyoutItem", | |
| HorizontalOptions = LayoutOptions.Start, | |
| VerticalOptions = LayoutOptions.Center | |
| }; | |
| flyoutPage.Content = new VerticalStackLayout | |
| { | |
| Children = { page1Button } | |
| }; | |
| // Create the detail content | |
| var detailPage = new ContentPage | |
| { | |
| Title = "Detail", | |
| BackgroundColor = Colors.LightYellow | |
| }; | |
| _button = new Button | |
| { | |
| Text = "Change Collapse Style", | |
| AutomationId = "CollapseStyleButton", | |
| }; | |
| _button.Clicked += OnCollapseStyleValueChanged; | |
| detailPage.Content = new VerticalStackLayout | |
| { | |
| Children = { | |
| new Microsoft.Maui.Controls.Label | |
| { | |
| Text = "Welcome to .NET MAUI!", | |
| TextColor = Colors.Black, | |
| HorizontalOptions = LayoutOptions.Center, | |
| VerticalOptions = LayoutOptions.Center | |
| }, | |
| _button | |
| } | |
| }; | |
| // Set the flyout and detail pages | |
| Flyout = flyoutPage; | |
| Detail = detailPage; | |
| } | |
| void OnCollapseStyleValueChanged(object sender, EventArgs e) | |
| { | |
| var currentCollapseStyle = this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().GetCollapseStyle(); | |
| var newCollapseStyle = currentCollapseStyle == CollapseStyle.Full | |
| ? CollapseStyle.Partial | |
| : CollapseStyle.Full; | |
| this.On<Microsoft.Maui.Controls.PlatformConfiguration.Windows>().SetCollapseStyle(newCollapseStyle); | |
| } |
| var flyoutLayoutBehavior = (view as FlyoutPage)?.FlyoutLayoutBehavior; | ||
| if (view is BindableObject bindable && handler.PlatformView is Microsoft.Maui.Platform.RootNavigationView navigationView && flyoutLayoutBehavior is FlyoutLayoutBehavior.Popover) | ||
| { | ||
| var collapseStyle = PlatformConfiguration.WindowsSpecific.FlyoutPage.GetCollapseStyle(bindable); | ||
| switch (collapseStyle) | ||
| { | ||
| case PlatformConfiguration.WindowsSpecific.CollapseStyle.Partial: | ||
| navigationView.PaneDisplayMode = Microsoft.UI.Xaml.Controls.NavigationViewPaneDisplayMode.LeftCompact; | ||
| break; | ||
| case PlatformConfiguration.WindowsSpecific.CollapseStyle.Full: | ||
| default: | ||
| navigationView.PaneDisplayMode = Microsoft.UI.Xaml.Controls.NavigationViewPaneDisplayMode.LeftMinimal; | ||
| break; | ||
| } | ||
| } |
There was a problem hiding this comment.
The pattern used here differs from the iOS platform-specific properties. Looking at the iOS PrefersHomeIndicatorAutoHiddenProperty and PrefersStatusBarHiddenProperty implementations in FlyoutPage.Mapper.cs, those mappers simply call handler.UpdateValue() to trigger the handler's mapper logic.
However, this implementation directly manipulates the PaneDisplayMode property inside MapCollapseStyle. While this works, it bypasses the normal mapper flow and could lead to inconsistencies if UpdatePaneDisplayModeFromFlyoutBehavior is called elsewhere (e.g., when FlyoutBehavior changes), which would reset PaneDisplayMode to LeftMinimal regardless of the CollapseStyle setting.
Consider integrating the CollapseStyle logic into UpdatePaneDisplayModeFromFlyoutBehavior in MauiNavigationView.cs so that it considers both FlyoutBehavior and CollapseStyle when determining the correct PaneDisplayMode. This would ensure the CollapseStyle is respected even when FlyoutBehavior changes at runtime.
| var flyoutLayoutBehavior = (view as FlyoutPage)?.FlyoutLayoutBehavior; | |
| if (view is BindableObject bindable && handler.PlatformView is Microsoft.Maui.Platform.RootNavigationView navigationView && flyoutLayoutBehavior is FlyoutLayoutBehavior.Popover) | |
| { | |
| var collapseStyle = PlatformConfiguration.WindowsSpecific.FlyoutPage.GetCollapseStyle(bindable); | |
| switch (collapseStyle) | |
| { | |
| case PlatformConfiguration.WindowsSpecific.CollapseStyle.Partial: | |
| navigationView.PaneDisplayMode = Microsoft.UI.Xaml.Controls.NavigationViewPaneDisplayMode.LeftCompact; | |
| break; | |
| case PlatformConfiguration.WindowsSpecific.CollapseStyle.Full: | |
| default: | |
| navigationView.PaneDisplayMode = Microsoft.UI.Xaml.Controls.NavigationViewPaneDisplayMode.LeftMinimal; | |
| break; | |
| } | |
| } | |
| handler.UpdateValue(nameof(IFlyoutView.FlyoutBehavior)); |
| @@ -0,0 +1,29 @@ | |||
| # if WINDOWS // It's a Windows specific API issue, so restricting the other platforms | |||
There was a problem hiding this comment.
According to the UI Testing Guidelines, platform-specific tests using #if directives should only be used when there's a specific technical limitation. The comment indicates this is a "Windows specific API issue", but CollapseStyle is designed to only affect Windows. Consider whether the test should still run on other platforms (where it would simply not test the CollapseStyle behavior) to ensure the FlyoutPage doesn't break on other platforms when the API is called. If this is truly Windows-only due to the API being Windows-specific by design (not a bug), the current approach is acceptable, but the comment should clarify this is by design, not a limitation.
| public void VerifyFlyoutCollapseStyleBehaviorChanges() | ||
| { | ||
| App.WaitForElement("CollapseStyleButton"); | ||
| App.Tap("CollapseStyleButton"); | ||
| App.TapFlyoutPageIcon(); | ||
| App.TapFlyoutPageIcon(); // Close the flyout | ||
| App.WaitForNoElement("FlyoutItem"); | ||
| App.Tap("CollapseStyleButton"); | ||
| App.WaitForElement("FlyoutItem"); | ||
| } |
There was a problem hiding this comment.
The test logic has a potential issue: Line 24 waits for "FlyoutItem" to not be present after setting CollapseStyle to Full and tapping twice (open/close). However, in Full collapse mode with a Popover layout, the flyout should be minimally collapsed and still closeable. The test then expects "FlyoutItem" to be visible again after switching back to Partial at line 26, but this seems to test visibility rather than the collapse style behavior.
Consider enhancing the test to verify the actual visual behavior difference between Full and Partial collapse styles, not just whether items are visible after opening/closing. The current test might pass even if CollapseStyle changes aren't working correctly, as long as the flyout opens and closes.
🤖 AI Summary📊 Expand Full Review —
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #29927 | Trigger handler updates when CollapseStyle changes, then map Windows CollapseStyle values to WinUI PaneDisplayMode at runtime |
PENDING (Gate) | src/Controls/src/Core/FlyoutPage/FlyoutPage.Mapper.cs, src/Controls/src/Core/PlatformConfiguration/WindowsSpecific/FlyoutPage.cs, src/Controls/tests/TestCases.HostApp/Issues/Issue18200.cs, src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue18200.cs |
Original PR |
🚦 Gate — Test Verification
Result: PASSED
Gate Result: PASSED
Platform: windows
Mode: Full Verification
- Tests FAIL without fix:
- Tests PASS with fix:
Notes
- Verification used
Issue18200on Windows. - Without the fix, the UI test timed out waiting for the flyout item state change, reproducing the bug.
- With the fix applied, the same test passed, confirming the PR resolves the runtime collapse-style update issue.
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix | Route CollapseStyle through MauiNavigationView's flyout-behavior pipeline using a pane-display-mode override instead of mutating PaneDisplayMode directly in the mapper |
PASS | 3 files | Robust against later FlyoutBehavior updates overwriting the collapse style |
| 2 | try-fix | Use a virtual flyout-pane-display-mode hook in MauiNavigationView/RootNavigationView so UpdatePaneDisplayModeFromFlyoutBehavior natively resolves compact vs minimal mode |
PASS | 4 files | Template-method style alternative that keeps collapse-style behavior inside the existing pipeline |
| 3 | try-fix | Reuse existing PinPaneDisplayModeTo support on RootNavigationView, set it from the new CollapseStyle mapper, then re-run IFlyoutView.FlyoutBehavior mapping |
PASS | 2 files | Smallest passing alternative before cross-pollination; leans on existing navigation-view behavior |
| 4 | try-fix | Use a Windows resource flag on the navigation view and let MauiNavigationView re-evaluate flyout behavior against that flag when CollapseStyle changes |
PASS | 2 files | Passes, but relies on a string-keyed resource flag and removes an existing flyout-behavior cache guard |
| 5 | try-fix | Wrap the existing Windows FlyoutBehavior mapper with ModifyMapping, then apply CollapseStyle after the base mapper runs and re-trigger via UpdateValue(FlyoutBehavior) on property change |
PASS | 2 files | Simplest robust passing option; keeps the behavior in the existing mapper pipeline without adding native-view state |
| 6 | try-fix | Let Windows native flyout behavior pull CollapseStyle directly from the virtual view via an internal interface and dual cache on behavior + collapse mode |
PASS | 6 files | Works, but materially broader than needed and introduces new cross-assembly coupling |
| 7 | try-fix | Register a native PaneDisplayModeProperty callback to re-enforce the requested collapse style whenever internal/native logic overwrites it |
PASS | 2 files | Passed after retries, but callback enforcement and weak-table bookkeeping are more invasive than necessary |
| 8 | try-fix | Register a shared MapPaneConfiguration mapper for both FlyoutLayoutBehavior and CollapseStyle and resolve the final native mode from combined state |
PASS | 2 files | Good unified-mapper variant, but less clearly aligned with the existing FlyoutBehavior update path than Candidate #5 |
| PR | PR #29927 | Add a property-changed callback and map CollapseStyle directly to WinUI PaneDisplayMode in the Windows mapper |
PASSED (Gate) | 4 files | Original PR |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 2 | Yes | Make the existing Windows FlyoutBehavior mapping compute PaneDisplayMode from both current FlyoutBehavior and attached CollapseStyle. Tested as Candidate #5. |
| claude-sonnet-4.6 | 2 | Yes | Let native flyout behavior pull CollapseStyle from the virtual view as source-of-truth. Tested as Candidate #6. |
| gpt-5.3-codex | 2 | No | NO NEW IDEAS |
| gemini-3-pro-preview | 2 | No | NO NEW IDEAS |
| claude-opus-4.6 | 3 | No | NO NEW IDEAS |
| claude-sonnet-4.6 | 3 | No | NO NEW IDEAS |
| gpt-5.3-codex | 3 | No | NO NEW IDEAS |
| gemini-3-pro-preview | 3 | Yes | Re-enforce collapse style through a native PaneDisplayModeProperty callback. Tested as Candidate #7. |
| gpt-5.3-codex | 4 | Yes | Use one shared mapper entrypoint for pane configuration across FlyoutLayoutBehavior and CollapseStyle. Tested as Candidate #8. |
Exhausted: Yes
Selected Fix: Candidate #5 Simplest robust passing solution. It keeps collapse-style handling in the existing FlyoutBehavior mapper pipeline without introducing new native-view state, new interfaces, or callback enforcement.
📋 Report — Final Recommendation
Final Recommendation: REQUEST CHANGES
Final Recommendation: REQUEST CHANGES
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | COMPLETE | Windows FlyoutPage runtime CollapseStyle update issue with UI coverage in Issue18200 |
| Gate | PASSED | Windows full verification: test failed without fix and passed with fix |
| Try-Fix | COMPLETE | 8 attempts, 8 passing alternatives, Candidate #5 selected |
| Report | COMPLETE |
Summary
The PR fixes the reported Windows bug for the current UI test, so the submitted implementation is functionally valid. However, the try-fix phase found a better alternative: Candidate #5 keeps CollapseStyle handling inside the existing FlyoutBehavior mapping pipeline and achieves the same passing behavior with fewer moving parts and lower risk of future drift.
Root Cause
The Windows FlyoutPage stack already has a native FlyoutBehavior pipeline that determines PaneDisplayMode. The bug occurs because runtime CollapseStyle changes never trigger that pipeline, so Windows stays on the original pane mode. The PR addresses that by directly setting PaneDisplayMode from a separate mapper, but that approach bypasses the existing flow that also manages pane mode and can create a second source of truth.
Fix Quality
The PR's fix passes the new test, but it directly mutates native state from a dedicated CollapseStyle mapper instead of integrating with the existing FlyoutBehavior update path. Candidate #5 is stronger because it wraps the existing Windows FlyoutBehavior mapping with ModifyMapping, applies CollapseStyle after the base mapper runs, and reuses UpdateValue(nameof(IFlyoutView.FlyoutBehavior)) on property change. That keeps all pane-mode decisions in one mapper pipeline and avoids adding extra native-view state, interfaces, or callback enforcement.
📋 Expand PR Finalization Review
PR #29927 Finalization Review
Title & Description
Title: Needs improvement
- Current:
[Windows] Fix Flyout Page SetCollapseStyle doesn't have any change - Recommended:
[Windows] FlyoutPage: update CollapseStyle at runtime
Assessment: The current title captures the issue but reads awkwardly and does not clearly describe the implemented behavior. The recommended title is more searchable and matches the actual fix.
Description: Good enough, but could be stronger
What works:
- Includes the required NOTE block
- Clearly states the Windows-specific runtime-update problem
- Matches the main implementation at a high level
- Includes the linked issue and tested platform
Suggested improvements:
- Add the root cause:
CollapseStylechanged the attached property value, but the handler was never notified, soRootNavigationView.PaneDisplayModestayed stale. - Mention the actual implementation details: a property-changed callback was added on
CollapseStyleProperty, and a Windows mapper now translatesCollapseStyleto WinUIPaneDisplayMode. - Mention the added UI regression test for issue
#18200.
Code Review Findings
Important issue
CollapseStyle can be overwritten by later FlyoutBehavior updates
- Files:
src/Controls/src/Core/FlyoutPage/FlyoutPage.Mapper.cs:39-56,src/Controls/src/Core/FlyoutPage/FlyoutPage.cs:328-359,src/Core/src/Platform/Windows/MauiNavigationView.cs:173-204 - Problem:
MapCollapseStylesetsRootNavigationView.PaneDisplayModedirectly, but Windows FlyoutPage re-runsHandler.UpdateValue(nameof(FlyoutBehavior))on size and display-orientation changes. That flows intoUpdatePaneDisplayModeFromFlyoutBehavior(), which unconditionally resetsFlyoutBehavior.FlyouttoLeftMinimal, so a previously selectedCollapseStyle.Partialcan be lost after resize/orientation changes. - Why it matters: The PR fixes the immediate runtime toggle case, but the chosen pane mode is not sticky across later layout-driven updates.
- Recommendation: Integrate
CollapseStyleinto the WinUI pane-mode calculation path, or pin the pane display mode instead of setting it once ad hoc, so laterFlyoutBehaviorremaps do not undoCollapseStyle.Partial.
Suggestion
The UI test does not cover the reset path above
- Files:
src/Controls/tests/TestCases.HostApp/Issues/Issue18200.cs,src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue18200.cs - Observation: The added test verifies toggling
CollapseStyleduring a steady-state session, but it does not exercise the size/orientation path that triggersFlyoutBehaviorremapping. - Recommendation: Extend the test coverage to validate that
CollapseStyle.Partialremains effective after a window resize or orientation/display-info change.
Overall
The PR metadata mostly matches the implementation, but I would update the title for clarity. More importantly, I would not consider the implementation fully finalized until the Windows pane-mode reset issue is addressed or explicitly ruled out.
🤖 AI Summary📊 Expand Full Review —
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #29927 | Trigger handler updates when CollapseStyle changes, then map Windows CollapseStyle values to WinUI PaneDisplayMode at runtime |
PENDING (Gate) | src/Controls/src/Core/FlyoutPage/FlyoutPage.Mapper.cs, src/Controls/src/Core/PlatformConfiguration/WindowsSpecific/FlyoutPage.cs, src/Controls/tests/TestCases.HostApp/Issues/Issue18200.cs, src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue18200.cs |
Original PR |
Issue: #18200 - Flyout Page SetCollapseStyle doesn't have any effect
PR: #29927 - [Windows] FlyoutPage: update CollapseStyle at runtime
Platforms Affected: Windows
Files Changed: 2 implementation, 2 test
Key Findings
- The linked issue reports that
WindowsSpecific.FlyoutPage.SetCollapseStyle(...)does not update FlyoutPage layout at runtime on Windows, even though the API previously worked in Xamarin.Forms. - The PR adds a property-changed callback to
CollapseStylePropertyand a Windows mapper that translatesCollapseStyleinto WinUINavigationViewPaneDisplayMode. - Test coverage was added as a HostApp issue page plus a shared Appium UI test, so the validation path is a Windows UI test using
Issue18200. - Prior discussion already raised two important concerns: later
FlyoutBehaviorremaps may overwrite the CollapseStyle-specific pane mode, and the new test only covers the immediate toggle path.
Edge Cases / Discussion Notes
- The issue thread includes a workaround that directly set WinUI
PaneDisplayModefrom a mapper, which is conceptually similar to the PR approach. - Inline review feedback questioned whether resize/orientation-driven
FlyoutBehaviorupdates can resetCollapseStyle.Partialafter the property changes. - The added UI test is Windows-only because
CollapseStyleis a Windows-specific API. - A prior PRAgent-style review exists on the PR thread, but this run is proceeding independently rather than resuming a partial local run.
File Classification
- Implementation:
src/Controls/src/Core/FlyoutPage/FlyoutPage.Mapper.cs - Implementation:
src/Controls/src/Core/PlatformConfiguration/WindowsSpecific/FlyoutPage.cs - Test (HostApp UI page):
src/Controls/tests/TestCases.HostApp/Issues/Issue18200.cs - Test (Shared UITest):
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue18200.cs - Test type: UI test via HostApp + Appium shared test
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #29927 | Add a property-changed callback for CollapseStyle, then map the Windows collapse style to WinUI PaneDisplayMode at runtime |
PENDING (Gate) | src/Controls/src/Core/FlyoutPage/FlyoutPage.Mapper.cs, src/Controls/src/Core/PlatformConfiguration/WindowsSpecific/FlyoutPage.cs, src/Controls/tests/TestCases.HostApp/Issues/Issue18200.cs, src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue18200.cs |
Original PR |
🚦 Gate — Test Verification
Result: PASSED
Gate Result: PASSED
Platform: windows
Mode: Full Verification
- Tests FAIL without fix:
- Tests PASS with fix:
Notes
- Verification used
Issue18200on Windows. - Without the fix, the UI test timed out waiting for the flyout item state change, reproducing the bug.
- With the fix applied, the same test passed, confirming the PR resolves the runtime collapse-style update issue.
Result: PASSED
Gate Result: PASSED
Platform: windows
Mode: Full Verification
- Tests FAIL without fix:
- Tests PASS with fix:
Notes
- Verification used
Issue18200on Windows. - Without the fix, the UI test timed out waiting for the expected element state change, reproducing the bug.
- With the fix applied, the same test passed, confirming the PR resolves the immediate runtime collapse-style update issue.
- Full verification report is available under
CustomAgentLogsTmp/PRState/29927/PRAgent/gate/verify-tests-fail/verification-report.md.
🔧 Fix — Analysis & Comparison
Result: PASSED
Gate Result: PASSED
Platform: windows
Mode: Full Verification
- Tests FAIL without fix:
- Tests PASS with fix:
Notes
- Verification used
Issue18200on Windows. - Without the fix, the UI test timed out waiting for the flyout item state change, reproducing the bug.
- With the fix applied, the same test passed, confirming the PR resolves the runtime collapse-style update issue.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix | Integrate CollapseStyle into the existing flyout-behavior pane-mode pipeline via a generic override on MauiNavigationView, instead of a dedicated CollapseStyle mapper that writes PaneDisplayMode directly |
PASS | 3 files | Reuses the same update path that runs on size/orientation changes |
| 2 | try-fix | Make MapFlyoutLayoutBehavior the single authoritative Controls-layer place that applies both flyout behavior and collapse style, and re-trigger it when CollapseStyle changes |
PASS | 2 files | Keeps all changes in Controls and reapplies after orientation-triggered behavior remaps |
| 3 | try-fix | Append collapse-style handling onto the existing IFlyoutView.FlyoutBehavior mapping path, and re-trigger that path when CollapseStyle changes |
PASS | 2 files | Most directly aligns with the existing pane-mode update path |
| 4 | try-fix | Modify mapping to run default flyout-behavior logic then apply a direct collapse-style override | FAIL | 1 file | Did not reliably hide the flyout item in the test environment |
| 5 | try-fix | Reset cached flyout-behavior tracking in MauiNavigationView, then re-run flyout-behavior mapping from a clean base before applying CollapseStyle |
PASS | 3 files | Explicit cache invalidation makes UpdateValue(FlyoutBehavior) effective again |
| 6 | try-fix | Move both flyout behavior and collapse-style state into native MauiNavigationView dependency properties so one native method computes the final PaneDisplayMode |
PASS | 4 files | Robust single-source-of-truth design, but broader than necessary |
| PR | PR #29927 | Add a property-changed callback for CollapseStyle, then map the Windows collapse style to WinUI PaneDisplayMode at runtime |
PASSED (Gate) | 4 files | Original PR |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 1 | Yes | Candidate #1: move CollapseStyle through the flyout-behavior pipeline with a MauiNavigationView override instead of a side-channel mapper. |
| claude-sonnet-4.6 | 1 | Yes | Candidate #2: keep pane-mode logic entirely in MapFlyoutLayoutBehavior and re-run that mapping when CollapseStyle changes. |
| gpt-5.3-codex | 1 | Yes | Candidate #3: compose collapse-style handling onto the existing IFlyoutView.FlyoutBehavior mapping and re-trigger that mapping on property change. |
| gemini-3-pro-preview | 1 | Yes | Candidate #4: rerun the default flyout-behavior mapping and then apply a direct override. |
| claude-opus-4.6 | 2 | No | NO NEW IDEAS |
| claude-sonnet-4.6 | 2 | Yes | Candidate #5: reset cached flyout-behavior tracking before re-running flyout-behavior mapping from a clean base. |
| gpt-5.3-codex | 2 | No | NO NEW IDEAS |
| gemini-3-pro-preview | 2 | Yes | Candidate #6: use native state/binding-style aggregation in MauiNavigationView so one method computes the final pane mode. |
| claude-opus-4.6 | 3 | No | NO NEW IDEAS |
| claude-sonnet-4.6 | 3 | No | NO NEW IDEAS |
| gpt-5.3-codex | 3 | No | NO NEW IDEAS |
| gemini-3-pro-preview | 3 | No | NO NEW IDEAS |
Exhausted: Yes
Selected Fix: Candidate #3 Simplest robust passing solution. It keeps CollapseStyle in the same IFlyoutView.FlyoutBehavior mapping path that already owns pane-mode updates, so later size/orientation remaps naturally preserve the requested collapse style without adding extra native state or broader plumbing.
📋 Report — Final Recommendation
Result: PASSED
Gate Result: PASSED
Platform: windows
Mode: Full Verification
- Tests FAIL without fix:
- Tests PASS with fix:
Notes
- Verification used
Issue18200on Windows. - Without the fix, the UI test timed out waiting for the flyout item state change, reproducing the bug.
- With the fix applied, the same test passed, confirming the PR resolves the runtime collapse-style update issue.
Final Recommendation: REQUEST CHANGES
Final Recommendation: REQUEST CHANGES
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | COMPLETE | Windows FlyoutPage runtime CollapseStyle update issue with UI coverage in Issue18200 |
| Gate | PASSED | Windows full verification: test failed without fix and passed with fix |
| Try-Fix | COMPLETE | 6 attempts tested, 5 passing alternatives plus the PR fix; Candidate #3 selected |
| Report | COMPLETE |
Summary
The PR's current implementation fixes the immediate Issue18200 runtime toggle scenario on Windows, and the new UI test correctly proves that. However, the try-fix phase found multiple simpler or better-aligned passing alternatives. The strongest option was Candidate #3, which keeps CollapseStyle in the same IFlyoutView.FlyoutBehavior mapping path that already governs pane-mode updates, instead of introducing a separate CollapseStyle mapper that writes native PaneDisplayMode directly.
Root Cause
Windows FlyoutPage already has an existing pipeline that recalculates PaneDisplayMode from FlyoutBehavior, including later re-evaluations caused by size or orientation changes. The bug exists because runtime CollapseStyle changes were not routed through that pipeline, so the requested compact/minimal state never got reflected. PR #29927 fixes the immediate symptom by adding a property-changed callback and directly mutating RootNavigationView.PaneDisplayMode, but that creates a second pane-mode decision path separate from the existing flyout-behavior flow.
Fix Quality
The submitted fix is functionally valid for the added regression test, but it bypasses the existing pane-mode update path and therefore is not the cleanest implementation. Candidate #3 achieved the same passing behavior with only two changed files by composing CollapseStyle into the existing IFlyoutView.FlyoutBehavior mapper path and re-triggering that path when the attached property changes. That keeps one authoritative pipeline for pane-mode decisions, aligns better with existing Windows FlyoutPage behavior, and avoids adding extra native state or a side-channel mapper.
📋 Expand PR Finalization Review
PR #29927 Finalization Review
Title & Description
Title: Needs improvement
- Current:
[Windows] Fix Flyout Page SetCollapseStyle doesn't have any change - Recommended:
[Windows] FlyoutPage: update CollapseStyle at runtime
Assessment: The current title captures the issue but reads awkwardly and does not clearly describe the implemented behavior. The recommended title is more searchable and matches the actual fix.
Description: Good enough, but could be stronger
What works:
- Includes the required NOTE block
- Clearly states the Windows-specific runtime-update problem
- Matches the main implementation at a high level
- Includes the linked issue and tested platform
Suggested improvements:
- Add the root cause:
CollapseStylechanged the attached property value, but the handler was never notified, soRootNavigationView.PaneDisplayModestayed stale. - Mention the actual implementation details: a property-changed callback was added on
CollapseStyleProperty, and a Windows mapper now translatesCollapseStyleto WinUIPaneDisplayMode. - Mention the added UI regression test for issue
#18200.
Code Review Findings
Important issue
CollapseStyle can be overwritten by later FlyoutBehavior updates
- Files:
src/Controls/src/Core/FlyoutPage/FlyoutPage.Mapper.cs:39-56,src/Controls/src/Core/FlyoutPage/FlyoutPage.cs:328-359,src/Core/src/Platform/Windows/MauiNavigationView.cs:173-204 - Problem:
MapCollapseStylesetsRootNavigationView.PaneDisplayModedirectly, but Windows FlyoutPage re-runsHandler.UpdateValue(nameof(FlyoutBehavior))on size and display-orientation changes. That flows intoUpdatePaneDisplayModeFromFlyoutBehavior(), which unconditionally resetsFlyoutBehavior.FlyouttoLeftMinimal, so a previously selectedCollapseStyle.Partialcan be lost after resize/orientation changes. - Why it matters: The PR fixes the immediate runtime toggle case, but the chosen pane mode is not sticky across later layout-driven updates.
- Recommendation: Integrate
CollapseStyleinto the WinUI pane-mode calculation path, or pin the pane display mode instead of setting it once ad hoc, so laterFlyoutBehaviorremaps do not undoCollapseStyle.Partial.
Suggestion
The UI test does not cover the reset path above
- Files:
src/Controls/tests/TestCases.HostApp/Issues/Issue18200.cs,src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue18200.cs - Observation: The added test verifies toggling
CollapseStyleduring a steady-state session, but it does not exercise the size/orientation path that triggersFlyoutBehaviorremapping. - Recommendation: Extend the test coverage to validate that
CollapseStyle.Partialremains effective after a window resize or orientation/display-info change.
Overall
The PR metadata mostly matches the implementation, but I would update the title for clarity. More importantly, I would not consider the implementation fully finalized until the Windows pane-mode reset issue is addressed or explicitly ruled out.
#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 <[email protected]>
@kubaflo , I have addressed the AI suggestion. |
🚦 Gate - Test Before and After Fix📊 Expand Full Gate —
|
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
🖥️ Issue18200 Issue18200 |
✅ FAIL — 568s | ✅ PASS — 464s |
🔴 Without fix — 🖥️ Issue18200: FAIL ✅ · 568s
Determining projects to restore...
Restored D:\a\1\s\src\Graphics\src\Graphics.Win2D\Graphics.Win2D.csproj (in 21.93 sec).
Restored D:\a\1\s\src\Graphics\src\Graphics\Graphics.csproj (in 21.93 sec).
Restored D:\a\1\s\src\Essentials\src\Essentials.csproj (in 8.49 sec).
Restored D:\a\1\s\src\Core\src\Core.csproj (in 16.79 sec).
Restored D:\a\1\s\src\Controls\tests\TestCases.HostApp\Controls.TestCases.HostApp.csproj (in 5.74 sec).
Restored D:\a\1\s\src\Controls\src\Xaml\Controls.Xaml.csproj (in 30 ms).
Restored D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj (in 31 ms).
Restored D:\a\1\s\src\Core\maps\src\Maps.csproj (in 14.52 sec).
Restored D:\a\1\s\src\Controls\Maps\src\Controls.Maps.csproj (in 35 ms).
Restored D:\a\1\s\src\Controls\Foldable\src\Controls.Foldable.csproj (in 17 ms).
Restored D:\a\1\s\src\BlazorWebView\src\Maui\Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 23 ms).
3 of 14 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Graphics.Win2D -> D:\a\1\s\artifacts\bin\Graphics.Win2D\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.Win2D.WinUI.Desktop.dll
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Core -> D:\a\1\s\artifacts\bin\Core\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Maps -> D:\a\1\s\artifacts\bin\Maps\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Maps.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Debug\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Controls.Foldable -> D:\a\1\s\artifacts\bin\Controls.Foldable\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Foldable.dll
Microsoft.AspNetCore.Components.WebView.Maui -> D:\a\1\s\artifacts\bin\Microsoft.AspNetCore.Components.WebView.Maui\Debug\net10.0-windows10.0.19041.0\Microsoft.AspNetCore.Components.WebView.Maui.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Controls.Maps -> D:\a\1\s\artifacts\bin\Controls.Maps\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Maps.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Controls.Xaml -> D:\a\1\s\artifacts\bin\Controls.Xaml\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Xaml.dll
Controls.TestCases.HostApp -> D:\a\1\s\artifacts\bin\Controls.TestCases.HostApp\Debug\net10.0-windows10.0.19041.0\win-x64\Controls.TestCases.HostApp.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:05:47.01
Determining projects to restore...
Restored D:\a\1\s\src\Controls\tests\CustomAttributes\Controls.CustomAttributes.csproj (in 851 ms).
Restored D:\a\1\s\src\TestUtils\src\VisualTestUtils\VisualTestUtils.csproj (in 3 ms).
Restored D:\a\1\s\src\TestUtils\src\VisualTestUtils.MagickNet\VisualTestUtils.MagickNet.csproj (in 6.83 sec).
Restored D:\a\1\s\src\Controls\tests\TestCases.WinUI.Tests\Controls.TestCases.WinUI.Tests.csproj (in 8.98 sec).
Restored D:\a\1\s\src\TestUtils\src\UITest.Core\UITest.Core.csproj (in 1 ms).
Restored D:\a\1\s\src\TestUtils\src\UITest.Appium\UITest.Appium.csproj (in 2 ms).
Restored D:\a\1\s\src\TestUtils\src\UITest.NUnit\UITest.NUnit.csproj (in 1.62 sec).
Restored D:\a\1\s\src\TestUtils\src\UITest.Analyzers\UITest.Analyzers.csproj (in 5.55 sec).
7 of 15 projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Debug\net10.0\Microsoft.Maui.Graphics.dll
Controls.CustomAttributes -> D:\a\1\s\artifacts\bin\Controls.CustomAttributes\Debug\net10.0\Controls.CustomAttributes.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Debug\net10.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Core -> D:\a\1\s\artifacts\bin\Core\Debug\net10.0\Microsoft.Maui.dll
Controls.Core.Design -> D:\a\1\s\artifacts\bin\Controls.Core.Design\Debug\net472\Microsoft.Maui.Controls.DesignTools.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Debug\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Debug\net10.0\Microsoft.Maui.Controls.dll
UITest.Core -> D:\a\1\s\artifacts\bin\UITest.Core\Debug\net10.0\UITest.Core.dll
VisualTestUtils -> D:\a\1\s\artifacts\bin\VisualTestUtils\Debug\netstandard2.0\VisualTestUtils.dll
UITest.Appium -> D:\a\1\s\artifacts\bin\UITest.Appium\Debug\net10.0\UITest.Appium.dll
UITest.NUnit -> D:\a\1\s\artifacts\bin\UITest.NUnit\Debug\net10.0\UITest.NUnit.dll
VisualTestUtils.MagickNet -> D:\a\1\s\artifacts\bin\VisualTestUtils.MagickNet\Debug\netstandard2.0\VisualTestUtils.MagickNet.dll
UITest.Analyzers -> D:\a\1\s\artifacts\bin\UITest.Analyzers\Debug\netstandard2.0\UITest.Analyzers.dll
Controls.TestCases.WinUI.Tests -> D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
Test run for D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 3/29/2026 7:35:01 PM FixtureSetup for Issue18200(Windows)
>>>>> 3/29/2026 7:35:09 PM VerifyFlyoutCollapseStyleBehaviorChanges Start
>>>>> 3/29/2026 7:35:29 PM VerifyFlyoutCollapseStyleBehaviorChanges Stop
>>>>> 3/29/2026 7:35:29 PM Log types:
Failed VerifyFlyoutCollapseStyleBehaviorChanges [20 s]
Error Message:
System.TimeoutException : Timed out waiting for element...
Stack Trace:
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.Issues.Issue18200.VerifyFlyoutCollapseStyleBehaviorChanges() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue18200.cs:line 26
at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
NUnit Adapter 4.5.0.0: Test execution complete
[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.10] Discovering: Controls.TestCases.WinUI.Tests
[xUnit.net 00:00:00.29] Discovered: Controls.TestCases.WinUI.Tests
Total tests: 1
Failed: 1
Test Run Failed.
Total time: 48.9120 Seconds
🟢 With fix — 🖥️ Issue18200: PASS ✅ · 464s
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Graphics.Win2D -> D:\a\1\s\artifacts\bin\Graphics.Win2D\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Graphics.Win2D.WinUI.Desktop.dll
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Core -> D:\a\1\s\artifacts\bin\Core\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Debug\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Maps -> D:\a\1\s\artifacts\bin\Maps\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Maps.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Controls.Maps -> D:\a\1\s\artifacts\bin\Controls.Maps\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Maps.dll
Microsoft.AspNetCore.Components.WebView.Maui -> D:\a\1\s\artifacts\bin\Microsoft.AspNetCore.Components.WebView.Maui\Debug\net10.0-windows10.0.19041.0\Microsoft.AspNetCore.Components.WebView.Maui.dll
Controls.Xaml -> D:\a\1\s\artifacts\bin\Controls.Xaml\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Xaml.dll
Controls.Foldable -> D:\a\1\s\artifacts\bin\Controls.Foldable\Debug\net10.0-windows10.0.19041.0\Microsoft.Maui.Controls.Foldable.dll
Controls.TestCases.HostApp -> D:\a\1\s\artifacts\bin\Controls.TestCases.HostApp\Debug\net10.0-windows10.0.19041.0\win-x64\Controls.TestCases.HostApp.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:05:32.51
Determining projects to restore...
All projects are up-to-date for restore.
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Graphics -> D:\a\1\s\artifacts\bin\Graphics\Debug\net10.0\Microsoft.Maui.Graphics.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Essentials -> D:\a\1\s\artifacts\bin\Essentials\Debug\net10.0\Microsoft.Maui.Essentials.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Core -> D:\a\1\s\artifacts\bin\Core\Debug\net10.0\Microsoft.Maui.dll
Controls.CustomAttributes -> D:\a\1\s\artifacts\bin\Controls.CustomAttributes\Debug\net10.0\Controls.CustomAttributes.dll
Controls.Core.Design -> D:\a\1\s\artifacts\bin\Controls.Core.Design\Debug\net472\Microsoft.Maui.Controls.DesignTools.dll
Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Debug\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684000
Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Debug\net10.0\Microsoft.Maui.Controls.dll
UITest.Core -> D:\a\1\s\artifacts\bin\UITest.Core\Debug\net10.0\UITest.Core.dll
UITest.NUnit -> D:\a\1\s\artifacts\bin\UITest.NUnit\Debug\net10.0\UITest.NUnit.dll
VisualTestUtils -> D:\a\1\s\artifacts\bin\VisualTestUtils\Debug\netstandard2.0\VisualTestUtils.dll
VisualTestUtils.MagickNet -> D:\a\1\s\artifacts\bin\VisualTestUtils.MagickNet\Debug\netstandard2.0\VisualTestUtils.MagickNet.dll
UITest.Appium -> D:\a\1\s\artifacts\bin\UITest.Appium\Debug\net10.0\UITest.Appium.dll
UITest.Analyzers -> D:\a\1\s\artifacts\bin\UITest.Analyzers\Debug\netstandard2.0\UITest.Analyzers.dll
Controls.TestCases.WinUI.Tests -> D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
Test run for D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
NUnit3TestExecutor discovered 1 of 1 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 3/29/2026 7:43:02 PM FixtureSetup for Issue18200(Windows)
>>>>> 3/29/2026 7:43:10 PM VerifyFlyoutCollapseStyleBehaviorChanges Start
>>>>> 3/29/2026 7:43:14 PM VerifyFlyoutCollapseStyleBehaviorChanges Stop
Passed VerifyFlyoutCollapseStyleBehaviorChanges [4 s]
NUnit Adapter 4.5.0.0: Test execution complete
[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.10] Discovering: Controls.TestCases.WinUI.Tests
[xUnit.net 00:00:00.36] Discovered: Controls.TestCases.WinUI.Tests
Test Run Successful.
Total tests: 1
Passed: 1
Total time: 27.5190 Seconds
📁 Fix files reverted (4 files)
eng/pipelines/ci-copilot.ymlsrc/Controls/src/Core/FlyoutPage/FlyoutPage.Mapper.cssrc/Controls/src/Core/PlatformConfiguration/WindowsSpecific/FlyoutPage.cssrc/Core/src/Platform/Windows/MauiNavigationView.cs
🤖 AI Summary📊 Expand Full Review —
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #29927 | Add propertyChanged callback + FlyoutPaneDisplayMode property + mapper registration |
✅ PASSED (Gate) | WindowsSpecific/FlyoutPage.cs, FlyoutPage.Mapper.cs, MauiNavigationView.cs |
Original PR |
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix (claude-opus-4.6) | propertyChanged calls handler.UpdateValue("FlyoutBehavior"); replaced FlyoutBehavior mapper on Windows to apply CollapseStyle override after base call | PASS | 2 files (WindowsSpecific/FlyoutPage.cs, FlyoutPage.Mapper.cs) | Simpler no new state on MauiNavigationView |
| 2 | try-fix (claude-sonnet-4.6) | propertyChanged directly calls | |||
| avView.UpdateFlyoutPaneDisplayMode(mode); added method + property to MauiNavigationView | PASS | 2 files (WindowsSpecific/FlyoutPage.cs, MauiNavigationView.cs) | No mapper changes needed | ||
| 3 | try-fix (gpt-5.3-codex) | Hooked FlyoutPage.PropertyChanged (not CollapseStyleProperty metadata) to trigger UpdateValue(FlyoutBehavior) | FAIL | 1 file (FlyoutPage.cs) | Attached property changes not surfaced through PropertyChanged override |
| 4 | try-fix (gpt-5.4) | propertyChanged calls handler.UpdateValue(FlyoutLayoutBehavior); modified MapFlyoutLayoutBehavior on Windows to also apply CollapseStyle override | PASS | 3 files | Bundles CollapseStyle into FlyoutLayoutBehavior mapper path |
| PR | PR #29927 | propertyChanged -> handler.UpdateValue(nameof(CollapseStyleProperty)) -> new MapCollapseStyle mapper sets FlyoutPaneDisplayMode + PaneDisplayMode; property on MauiNavigationView ensures robustness through re-evaluations | PASSED (Gate) | 3 files | Dedicated mapper; minor code quality issues |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 2 | No | All approaches are detect-change + update-PaneDisplayMode. Space exhausted. |
Exhausted: Yes
Selected Fix: PR #29927 Dedicated mapper approach is architecturally cleanest, consistent with iOS platform-specific pattern. FlyoutPaneDisplayMode property ensures robustness. Gate PASSED. Minor code quality issues to address.
📋 Report — Final Recommendation
✅ Final Recommendation: APPROVE
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | ✅ COMPLETE | Issue #18200, Windows-only, 3 impl + 2 test files |
| Gate | ✅ PASSED | Windows platform |
| Try-Fix | ✅ COMPLETE | 4 attempts: 3 passing, 1 failing; cross-pollination exhausted |
| Report | ✅ COMPLETE |
Summary
PR #29927 fixes a long-standing issue where FlyoutPage.SetCollapseStyle() on Windows had no runtime effect. The fix is correct, well-structured, and the gate test passes. Three independent alternative approaches were found during Try-Fix, confirming the fix space is well-understood. The PR's chosen architecture is the most maintainable. Minor code quality issues should be addressed before merge.
Root Cause
CollapseStyleProperty in WindowsSpecific/FlyoutPage.cs was declared without a propertyChanged callback. As an attached BindableProperty, runtime value changes generated no notifications — neither the handler nor the platform view was ever told to update. The UpdatePaneDisplayModeFromFlyoutBehavior path in MauiNavigationView always defaulted to LeftMinimal, ignoring any previously-set CollapseStyle.
Fix Quality
The PR's three-part fix is architecturally sound:
-
propertyChangedcallback onCollapseStyleProperty— minimal, correct hook; callshandler.UpdateValue(nameof(CollapseStyleProperty))to route through the mapper system (consistent with how iOS platform-specific properties work in the same file). -
MapCollapseStylemapper registered inFlyoutPage.Mapper.cs— dedicated mapper for CollapseStyle (clean separation of concerns, consistent with iOSMapPrefersHomeIndicatorAutoHiddenPropertypattern). SetsFlyoutPaneDisplayModeonRootNavigationViewto persist the desired mode. -
FlyoutPaneDisplayModeproperty onMauiNavigationView— ensures CollapseStyle survives layout-drivenFlyoutBehaviorre-evaluations (e.g., resize/orientation).UpdatePaneDisplayModeFromFlyoutBehaviornow reads this property so CollapseStyle.Partial (LeftCompact) persists even when FlyoutBehavior is re-mapped.
Simpler alternatives existed (Try-Fix Attempt 1: 2 files, no new state) but the PR's approach is more correct: dedicated mapper for each concern, FlyoutPaneDisplayMode stored explicitly on the platform view.
Issues to Address Before Merge
These should be fixed but do not require a different fix approach:
-
PlatformAffected.UWP→PlatformAffected.WindowsinIssue18200.csline 6 — UWP is the wrong enum value for WinUI3/MAUI Windows apps. -
Extra space in
usingstatement inIssue18200.csline 2:using Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific;has a double space. -
Mixed indentation in
Issue18200.cs— file uses spaces in some places, tabs in others. Rundotnet formatto normalize. -
Test validation strength — the test verifies flyout item visibility (Partial = visible strip, Full = hidden) which is a valid proxy for pane display mode. Acceptable given the Windows NavigationView behavior.
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue details FlyoutPage on Windows did not update its layout when the CollapseStyle property changed at runtime. ### Description of Change <!-- Enter description of the fix in this section --> This update enables dynamic support for the CollapseStyle property in FlyoutPage on Windows. It allows the flyout pane to update at runtime when the property changes, ### 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 #18200 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> **Tested the behavior in the following platforms.** - [x] Windows | Before | After | |---------|--------| | **Windows**<br> <video src="https://github.com/user-attachments/assets/9d7844d7-af65-465a-abb3-b611290afe1f" width="400" height="250"> |**Windows**<br> <video src="https://github.com/user-attachments/assets/2edd0934-c369-4dda-8269-e22291769c2e" width="400" height="250"> |
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue details FlyoutPage on Windows did not update its layout when the CollapseStyle property changed at runtime. ### Description of Change <!-- Enter description of the fix in this section --> This update enables dynamic support for the CollapseStyle property in FlyoutPage on Windows. It allows the flyout pane to update at runtime when the property changes, ### 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#18200 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> **Tested the behavior in the following platforms.** - [x] Windows | Before | After | |---------|--------| | **Windows**<br> <video src="https://github.com/user-attachments/assets/9d7844d7-af65-465a-abb3-b611290afe1f" width="400" height="250"> |**Windows**<br> <video src="https://github.com/user-attachments/assets/2edd0934-c369-4dda-8269-e22291769c2e" width="400" height="250"> |
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue details FlyoutPage on Windows did not update its layout when the CollapseStyle property changed at runtime. ### Description of Change <!-- Enter description of the fix in this section --> This update enables dynamic support for the CollapseStyle property in FlyoutPage on Windows. It allows the flyout pane to update at runtime when the property changes, ### 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 #18200 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> **Tested the behavior in the following platforms.** - [x] Windows | Before | After | |---------|--------| | **Windows**<br> <video src="https://github.com/user-attachments/assets/9d7844d7-af65-465a-abb3-b611290afe1f" width="400" height="250"> |**Windows**<br> <video src="https://github.com/user-attachments/assets/2edd0934-c369-4dda-8269-e22291769c2e" width="400" height="250"> |
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue details FlyoutPage on Windows did not update its layout when the CollapseStyle property changed at runtime. ### Description of Change <!-- Enter description of the fix in this section --> This update enables dynamic support for the CollapseStyle property in FlyoutPage on Windows. It allows the flyout pane to update at runtime when the property changes, ### 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#18200 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> **Tested the behavior in the following platforms.** - [x] Windows | Before | After | |---------|--------| | **Windows**<br> <video src="https://github.com/user-attachments/assets/9d7844d7-af65-465a-abb3-b611290afe1f" width="400" height="250"> |**Windows**<br> <video src="https://github.com/user-attachments/assets/2edd0934-c369-4dda-8269-e22291769c2e" width="400" height="250"> |
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue details FlyoutPage on Windows did not update its layout when the CollapseStyle property changed at runtime. ### Description of Change <!-- Enter description of the fix in this section --> This update enables dynamic support for the CollapseStyle property in FlyoutPage on Windows. It allows the flyout pane to update at runtime when the property changes, ### 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 #18200 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> **Tested the behavior in the following platforms.** - [x] Windows | Before | After | |---------|--------| | **Windows**<br> <video src="https://github.com/user-attachments/assets/9d7844d7-af65-465a-abb3-b611290afe1f" width="400" height="250"> |**Windows**<br> <video src="https://github.com/user-attachments/assets/2edd0934-c369-4dda-8269-e22291769c2e" width="400" height="250"> |
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue details FlyoutPage on Windows did not update its layout when the CollapseStyle property changed at runtime. ### Description of Change <!-- Enter description of the fix in this section --> This update enables dynamic support for the CollapseStyle property in FlyoutPage on Windows. It allows the flyout pane to update at runtime when the property changes, ### 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 #18200 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> **Tested the behavior in the following platforms.** - [x] Windows | Before | After | |---------|--------| | **Windows**<br> <video src="https://github.com/user-attachments/assets/9d7844d7-af65-465a-abb3-b611290afe1f" width="400" height="250"> |**Windows**<br> <video src="https://github.com/user-attachments/assets/2edd0934-c369-4dda-8269-e22291769c2e" width="400" height="250"> |
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Issue details FlyoutPage on Windows did not update its layout when the CollapseStyle property changed at runtime. ### Description of Change <!-- Enter description of the fix in this section --> This update enables dynamic support for the CollapseStyle property in FlyoutPage on Windows. It allows the flyout pane to update at runtime when the property changes, ### 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 #18200 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> **Tested the behavior in the following platforms.** - [x] Windows | Before | After | |---------|--------| | **Windows**<br> <video src="https://github.com/user-attachments/assets/9d7844d7-af65-465a-abb3-b611290afe1f" width="400" height="250"> |**Windows**<br> <video src="https://github.com/user-attachments/assets/2edd0934-c369-4dda-8269-e22291769c2e" width="400" height="250"> |
## Blazor - Fix: Filter precompressed RCL assets from MAUI Blazor Hybrid APKs by @mattleibow in #33917 <details> <summary>🔧 Fixes</summary> - [.NET MAUI Blazor Hybrid App should not precompress assets](#33773) </details> - [Windows] Fix for Runtime error when closing external window with WPF Webview Control by @BagavathiPerumal in #34006 <details> <summary>🔧 Fixes</summary> - [Runtime error when closing external window with WPF Webview Control](#32944) </details> ## Button - [Android] ImageButton CornerRadius not being applied - fix by @kubaflo in #30074 <details> <summary>🔧 Fixes</summary> - [ImageButton CornerRadius not being applied on Android](#23854) </details> - Fix Disabled visual state ignored when Button has locally-set BackgroundColor/TextColor by @Dhivya-SF4094 in #34444 <details> <summary>🔧 Fixes</summary> - [[regression/9.0] VisualState "Disabled" is not properly applied for Button with custom appearance](#34363) </details> ## CollectionView - Fix CollectionView grid spacing updates for first row and column by @KarthikRajaKalaimani in #34527 <details> <summary>🔧 Fixes</summary> - [[MAUI] I2_Vertical grid for horizontal Item Spacing and Vertical Item Spacing - horizontally updating the spacing only applies to the second column](#34257) </details> - Fix CollectionView record struct selection on Windows by @jeremy-visionaid in #33488 - [Android] Ensure disconnected ItemsViewHandler doesn't hold onto the items source by @filipnavara in #24610 <details> <summary>🔧 Fixes</summary> - [Crash on NullReferenceException with measurement cells in CollectionView](#24304) </details> - [Windows] Fixed VisualState Setters not working properly for CollectionView by @Dhivya-SF4094 in #27230 <details> <summary>🔧 Fixes</summary> - [VisualState Setters not working properly on Windows for a CollectionView](#27086) - [[regression/8.0.3] [Windows][CollectionView]Label Disappear when set Style in ContentPage.Resources](#19209) - [[Windows] Label style defined as ContentPage Resource doesn't propagate to CollectionView](#18701) </details> - [Windows] Fixed Margin doesn't work inside CollectionView EmptyView by @Dhivya-SF4094 in #29897 <details> <summary>🔧 Fixes</summary> - [Margin doesn't work inside CollectionView EmptyView](#8494) </details> - [Android, Windows] Fix CarouselView PreviousPosition/PreviousItem incorrect during animated ScrollTo() by @praveenkumarkarunanithi in #34570 <details> <summary>🔧 Fixes</summary> - [[Android] CurrentItemChangedEventArgs.PreviousItem and PositionChangedEventArgs.PreviousPosition Not Updating Correctly When Using ScrollTo or Setting Position](#29544) </details> - [iOS] CarouselView2: Update internal scroll indicators for compositional layout by @SubhikshaSf4851 in #33639 <details> <summary>🔧 Fixes</summary> - [[iOS] Horizontal Scroll Bar Not Visible on CarouselView (CV2)](#29390) </details> - [CarouselViewHandler2] Fir fox CurrentItem does not work when ItemSpacing is set by @SyedAbdulAzeemSF4852 in #32135 <details> <summary>🔧 Fixes</summary> - [[CarouselViewHandler2] CurrentItem does not work when ItemSpacing is set](#32048) </details> - [iOS] Fix for Incorrect Scroll in Loop Mode When CurrentItem Is Not Found in ItemsSource by @SyedAbdulAzeemSF4852 in #32141 <details> <summary>🔧 Fixes</summary> - [[Android & iOS] Setting an invalid CurrentItem causes scroll to last item in looped CarouselView](#32139) </details> - [Android] IndicatorView: Add TalkBack accessibility descriptions for indicators by @praveenkumarkarunanithi in #31775 <details> <summary>🔧 Fixes</summary> - [[Android] IndicatorView does not convey correct accessibility information](#31446) </details> - [iOS, macOS] Fixed CollectionView KeepLastItemInView Not Updating Correctly When Items Are Added Dynamically by @NanthiniMahalingam in #32191 <details> <summary>🔧 Fixes</summary> - [[.NET10] I9 - Scroll_Position - "KeepLastItemInView" does not keep the last item at the end of the displayed list when adding new items.](#31825) </details> - [Windows, Android] Resolved issue with dynamic Header/Footer reassignment in CollectionView. by @prakashKannanSf3972 in #28403 <details> <summary>🔧 Fixes</summary> - [[Windows, Android] Toggling Header/Footer in CollectionView Dynamically is not working](#27959) - [CollectionView HeaderTemplate and FooterTemplate are not displayed when ItemsSource is initially set to null](#28337) - [[Android] Header and Footer Not Visible in CollectionView When EmptyView is Selected First](#28351) </details> - [Android] Fix CollectionView inside disabled RefreshView blocks scroll by @Vignesh-SF3580 in #34702 <details> <summary>🔧 Fixes</summary> - [C6-The C6 page cannot scroll on Windows and Android platforms.](#34666) </details> - [Android] CollectionView: Fix SelectedItem visual state not applying when re-selecting same item by @KarthikRajaKalaimani in #31591 <details> <summary>🔧 Fixes</summary> - [CollectionView - SelectedItem visual state manager not working](#20062) </details> - [Windows] Fixed CollectionView.EmptyView can not be removed by setting it to Null by @Dhivya-SF4094 in #29487 <details> <summary>🔧 Fixes</summary> - [[Windows] CollectionView.EmptyView can not be removed by setting it to Null](#18657) - [[Windows] EmptyViewTemplate Not Working in CarouselView](#29463) - [EmptyViewTemplate does not do anything](#18551) - [[MAUI] I5_EmptyView - The data template selector cannot display the correct string.](#23330) </details> - [iOS] Support for IsSwipeEnabled on CarouselView2 by @kubaflo in #29996 <details> <summary>🔧 Fixes</summary> - [[iOS] IsSwipeEnabled Not Working on CarouselView (CV2)](#29391) </details> - [iOS, MacOS] Fixed FlowDirection not working on Header/Footer in CollectionView by @Dhivya-SF4094 in #32775 <details> <summary>🔧 Fixes</summary> - [[iOS, MacOS] FlowDirection not working on Header/Footer in CollectionView](#32771) </details> - [iOS] CollectionView: Fix drag-and-drop reordering into empty groups by @SuthiYuvaraj in #34151 <details> <summary>🔧 Fixes</summary> - [CollectionView Drag and Drop Reordering Can't Drop in Empty Group](#12008) </details> - [Android] CollectionView: Fix drag-and-drop reordering into empty groups by @SuthiYuvaraj in #31867 <details> <summary>🔧 Fixes</summary> - [CollectionView Drag and Drop Reordering Can't Drop in Empty Group](#12008) </details> - [iOS] Fix vertical CarouselView MandatorySingle snapping on iOS by @Vignesh-SF3580 in #34700 <details> <summary>🔧 Fixes</summary> - [CarouselView vertical snap points ignored on iOS with Microsoft.Maui.Controls v10.0.20 (regression from v9.0.120)](#33308) </details> - [iOS26] Fix CarouselView scrolling to wrong item when navigating to last item by @Vignesh-SF3580 in #34013 <details> <summary>🔧 Fixes</summary> - [[iOS 26] CarouselView does not scroll to the correct last item](#33770) </details> - Fixed the OnPlatform does not work for header property in Collection view by @NanthiniMahalingam in #28935 <details> <summary>🔧 Fixes</summary> - [OnPlatform does not work in Header of CollectionView](#25124) </details> - [Android] [Candidate branch] Fix VerifySelectedItemClearsOnNullAssignment, CollectionViewSelectionShouldClear, SelectedItemVisualIsCleared UI test failure on Android by @KarthikRajaKalaimani in #34928 ## DateTimePicker - [iOS] Fix for DatePicker FlowDirection Not Working on iOS by @SyedAbdulAzeemSF4852 in #30193 <details> <summary>🔧 Fixes</summary> - [[iOS] DatePicker FlowDirection Not Working on iOS](#30065) </details> ## Drawing - [Shapes] Line: Fix asymmetric Stretch.None path translation when right/bottom edge overflows by @NirmalKumarYuvaraj in #34385 <details> <summary>🔧 Fixes</summary> - [Line coordinates not computed correctly](#11404) - [Lines not drawing correctly](#26961) </details> - [Android] Fixed GraphicsView drawable is visible outside the canvas by @NirmalKumarYuvaraj in #28353 <details> <summary>🔧 Fixes</summary> - [[Android] GraphicsView, The drawn image can also be visible outside the canvas](#20834) </details> - Fixed Custom Drawable does not support binding by @NirmalKumarYuvaraj in #29442 <details> <summary>🔧 Fixes</summary> - [Custom IDrawable control does not databind to a model property when used inside a CollectionView ItemTemplate](#20991) </details> - Added a support for GradientBrushes on Shape.Stroke by @kubaflo in #22208 <details> <summary>🔧 Fixes</summary> - [GradientBrushes are not supported on Shape.Stroke](#21983) </details> ## Editor - Fixed Editor HorizontalTextAlignment does not update at run time by @NirmalKumarYuvaraj in #25129 <details> <summary>🔧 Fixes</summary> - [Editor HorizontalTextAlignment Does not Works.](#10987) - [[iOS/MacOs] Right-To-Left (RTL) alignment is not applied to Editor placeholder](#30052) </details> - [Windows] Fixed Entry Editor placeholder Text CharacterSpacing by @SubhikshaSf4851 in #30324 <details> <summary>🔧 Fixes</summary> - [[Windows] CharacterSpacing not applied to Placeholder text in Entry and Editor controls](#30071) </details> ## Entry - [Windows] Fix fo setting an Entry's Keyboard to Date causes it to be interpreted as a password input by @SyedAbdulAzeemSF4852 in #29344 <details> <summary>🔧 Fixes</summary> - [[Windows] Entry Keyboad-Type "Date" results in Password-Entry](#28975) </details> - [Android] Exception thrown when give more than 5000 characters to the Text property of Entry. by @KarthikRajaKalaimani in #30242 <details> <summary>🔧 Fixes</summary> - [Android crash when Entry has >5000 characters](#30144) </details> ## Essentials - Bump MonoApiToolsMSBuildTasksPackageVersion to 0.5.0 and ship Essentials.AI public APIs by @mattleibow via @Copilot in #34574 - [Mac] DeviceDisplay.KeepScreenOn not being respected on Mac OS by @HarishwaranVijayakumar in #32708 <details> <summary>🔧 Fixes</summary> - [[Mac Catalyst] DeviceDisplay.KeepScreenOn not being respected on Mac OS](#26059) </details> ## Flyoutpage - [Windows] FlyoutPage: update CollapseStyle at runtime by @devanathan-vaithiyanathan in #29927 <details> <summary>🔧 Fixes</summary> - [Flyout Page SetCollapseStyle doesn't have any change](#18200) </details> ## Gestures - [Android] Fix for TapGestureRecognizer doesn't fire by @HarishwaranVijayakumar in #34497 <details> <summary>🔧 Fixes</summary> - [[Android] TapGestureRecognizer doesn't fire](#5825) </details> ## Image - [Android] Fix Share.RequestAsync SecurityException on Android 10+ caused by missing ClipData by @HarishwaranVijayakumar in #34417 <details> <summary>🔧 Fixes</summary> - [[Bug] Share.RequestAsync throws java.lang.SecurityException (uid=1000) on Android 10+ due to missing intent.ClipData](#34370) </details> - [Windows]Fixed the MauiImage with logical name containing path issue by @sheiksyedm in #32864 <details> <summary>🔧 Fixes</summary> - [MauiImage with LogicalName containing path - is not working on Windows](#32356) </details> - [Android, Windows & iOS] Fix Downsize/ScaleImage to maintain aspect ratio and prevent upscaling by @SyedAbdulAzeemSF4852 in #30808 <details> <summary>🔧 Fixes</summary> - [[Android & Windows] In GraphicsView, the aspect ratio is not maintained when Downsize is called with both maxWidth and maxHeight](#30803) </details> ## Label - [iOS , macOS] Fixed Label text cropping when a width request is specified on the label inside a VerticalStackLayout with specified width request by @NanthiniMahalingam in #29166 <details> <summary>🔧 Fixes</summary> - [Label text gets cropped when a width request is specified on the label inside a VerticalStackLayout](#28660) - [[iOS] Label with a fixed WidthRequest has wrong height](#26644) </details> - [Android] Fix Label word wrapping clips text depending on alignment and layout options by @Dhivya-SF4094 in #34533 <details> <summary>🔧 Fixes</summary> - [Bug: Android Label word wrapping clips text depending on alignment and layout options](#34459) </details> - LineHeight and decorations for HTML Label - fix by @kubaflo in #31202 <details> <summary>🔧 Fixes</summary> - [LineHeight with HTML Label not working](#22193) - [lineheight is broken ](#22197) </details> - [iOS] Fix Label with TailTruncation not rendering after empty-to-non-empty text transition by @kubaflo in #34812 <details> <summary>🔧 Fixes</summary> - [Label with LineBreakMode="TailTruncation" does not render text if initial Text is null or empty on first render (iOS)](#34591) </details> ## Layout - [Android] Fix overflowing children clipped when parent Opacity < 1 by @SyedAbdulAzeemSF4852 in #34565 <details> <summary>🔧 Fixes</summary> - [Maui Android parent view inappropriately creates clipping mask when its opacity is less than 1, cropping out children](#22038) </details> - Fixed the FlexLayout reverse issue with the AlignContent by @Ahamed-Ali in #32134 <details> <summary>🔧 Fixes</summary> - [FlexLayout alignment issue when Wrap is set to Reverse and AlignContent is set to SpaceAround, SpaceBetween or SpaceEvenly](#31565) </details> - [iOS/Mac] Fixed BoxView in AbsoluteLayout did not return to its default AutoSize for Height and Width after reset by @Dhivya-SF4094 in #31648 <details> <summary>🔧 Fixes</summary> - [[iOS, Catalyst] BoxView in AbsoluteLayout does not return to default AutoSize for Height/Width after reset](#31496) </details> ## Map - [Windows] Implement WinUI 3 MapControl handler using Azure Maps by @jfversluis in #34138 ## Modal - [Android] PopToRootAsync for modal pages - improvements by @kubaflo in #26851 <details> <summary>🔧 Fixes</summary> - [Shell PopToRootAsync doesn't happen instantly - previous pages flash quickly. Only happens in NET 9](#26846) </details> - [Android] Fix HideSoftInputOnTapped doesn't work on Modal Pages by @HarishwaranVijayakumar in #34770 <details> <summary>🔧 Fixes</summary> - [HideSoftInputOnTapped doesn't work on Modal Pages](#34730) </details> ## Navigation - [iOS] Alert popup may be displayed on wrong window when modal page navigation is in progress - fix by @kubaflo in #31016 <details> <summary>🔧 Fixes</summary> - [Alert popup may be displayed on wrong window when modal page navigation is in progress on iOS/MacOS](#30970) </details> - [Android] Page: Fix OnNavigatedTo called twice when NavigationPage is FlyoutPage Detail by @KarthikRajaKalaimani in #31931 <details> <summary>🔧 Fixes</summary> - [NavigationPage and FlyoutPage both call OnNavigatedTo, so it is called twice](#23902) </details> ## Picker - Fixed the Picker didn't dismiss it when tapping outside on iOS and MacCatalyst platform. by @KarthikRajaKalaimani in #30067 <details> <summary>🔧 Fixes</summary> - [[regression/8.0.3] iOS Picker dismiss does not work when clicking outside of the Picker](#19168) </details> - [Windows] Fixed Picker items width wont resize back by @SubhikshaSf4851 in #33042 <details> <summary>🔧 Fixes</summary> - [Picker items width won't resize back when its container window gets resized down.](#32984) </details> ## RadioButton - Fix TalkBack not correctly narrating RadioButtons with Content by @SubhikshaSf4851 in #34521 <details> <summary>🔧 Fixes</summary> - [[Android] TalkBack does not correctly narrate RadioButtons with Content](#34322) </details> ## SafeArea - [Android] Fix SafeAreaShouldWorkOnAllShellTabs test failure on API 36 by @praveenkumarkarunanithi in #34239 ## ScrollView - [iOS] Preserve ScrollView offsets when Orientation changes to Neither by @Vignesh-SF3580 in #34672 <details> <summary>🔧 Fixes</summary> - [Incorrect implementation of ScrollView.Orientation](#34583) </details> ## Searchbar - [Android] Fix SearchBar text bleeding between instances after navigation by @SyedAbdulAzeemSF4852 in #34703 <details> <summary>🔧 Fixes</summary> - [MAUI Android: SearchBar copies content from one to the other](#20348) </details> - Fixed SearchBar CursorPosition and SelectionLength not updating when typing by @Dhivya-SF4094 in #34347 <details> <summary>🔧 Fixes</summary> - [SearchBar - CursorPosition and SelectionLength are not updated when the user types](#30779) </details> ## SearchBar - [Windows] Fixed SearchHandler issues by @Tamilarasan-Paranthaman in #29520 <details> <summary>🔧 Fixes</summary> - [[Windows] SearchHandler APIs are not functioning properly](#29493) </details> ## Shell - [iOS, Mac] Fix for Background set to Transparent doesn't have the same behavior as BackgroundColor Transparent by @HarishwaranVijayakumar in #32245 <details> <summary>🔧 Fixes</summary> - [Background set to Transparent doesn't have the same behavior as BackgroundColor = Transparent](#22769) </details> - [iOS] Fix App crash with NullReferenceException in ShellSectionRenderer by @devanathan-vaithiyanathan in #32109 <details> <summary>🔧 Fixes</summary> - [[iOS] App crash with NullReferenceException in ShellSectionRenderer](#31961) </details> - [Android] Fixed back button icon selection logic in ShellToolbarTracker by @kubaflo in #32080 <details> <summary>🔧 Fixes</summary> - [IconOverride in Shell.BackButtonBehavior does not work.](#32050) </details> - Fix TabBarIsVisible Not Updating Dynamically When Set on ShellContent by @Vignesh-SF3580 in #33090 <details> <summary>🔧 Fixes</summary> - [Shell.TabBarIsVisible is not updated dynamically at runtime](#32994) </details> - [iOS, macOS] Shell: Fix RTL flow direction for flyout, menu cells, tab bar, and Locked flyout position by @NanthiniMahalingam in #32701 <details> <summary>🔧 Fixes</summary> - [[iOS, Mac Catalyst] Shell Flyout and Content Do Not Fully Support RightToLeft (RTL)](#32419) </details> - [IOS] Inconsistent Resize Behavior for Header/Footer - fix by @kubaflo in #28713 <details> <summary>🔧 Fixes</summary> - [[IOS, Mac] Inconsistent Resize Behavior for Header/Footer](#26397) - [Enable Shell Flyout Header/Footer resize tests on iOS/Catalyst](#33501) </details> - [Android] Fix for SearchHandler retaining previous page SearchView data in pages within Shell sections by @BagavathiPerumal in #29545 <details> <summary>🔧 Fixes</summary> - [[Shell][Android] The truth is out there...but not on top tab search handlers](#8716) </details> - [Android] Fix empty space above TabBar after navigating back when TabBar visibility is toggled by @praveenkumarkarunanithi in #34324 <details> <summary>🔧 Fixes</summary> - [Empty space appears above TabBar after navigating back when TabBar visibility is toggled](#33703) - [Grid with SafeAreaEdges=Container has incorrect size when tab bar appears](#34256) </details> ## SwipeView - [Android] SwipeView: Use MeasureSpecMode.Exactly for SwipeItem layout to fix text visibility by @Ahamed-Ali in #27399 <details> <summary>🔧 Fixes</summary> - [[Android] Right SwipeView items are not visible in the SwipeView.](#27367) </details> - [Android] Prevent the tap that closes an open SwipeView from being propagated to children by @sjordanGSS in #24275 <details> <summary>🔧 Fixes</summary> - [Tapping to close a SwipeView will activate TapGestureRecognizers on .Content](#23921) </details> ## Switch - [iOS & Mac] Fix for SearchHandler retains previous page state when switching top tabs by @BagavathiPerumal in #34735 <details> <summary>🔧 Fixes</summary> - [[Shell] [iOS & Mac] SearchHandler retains previous page state when switching top tabs](#34693) </details> ## TabbedPage - [Android] Fixed NullReferenceException in app with TabBar after returning from minimized state by @NirmalKumarYuvaraj in #34779 <details> <summary>🔧 Fixes</summary> - [NullReferenceException in app with TabBar after returning from minimized state](#34720) </details> ## Titlebar - Fixed BindingContext of the Window TitleBar is not being passed on to its child content. by @NirmalKumarYuvaraj in #30080 <details> <summary>🔧 Fixes</summary> - [The BindingContext of the Window TitleBar is not being passed on to its child content.](#24831) </details> - [Windows/Mac] Fix RTL FlowDirection causes overlap with native window control buttons in TitleBar by @devanathan-vaithiyanathan in #30400 <details> <summary>🔧 Fixes</summary> - [[Windows, Mac] RTL FlowDirection causes overlap with native window control buttons in TitleBar](#30399) </details> ## WebView - [Windows] Fix WebView background color not being applied by @SubhikshaSf4851 in #34599 <details> <summary>🔧 Fixes</summary> - [WebView background color has changed after update, can't override.](#34518) </details> - [Android] Fix for WebView/HybridWebView briefly flashes full screen before layout completes by @praveenkumarkarunanithi in #33207 <details> <summary>🔧 Fixes</summary> - [[Android] HybridWebView briefly resizes to full screen when page is opened before snapping back to correct size](#31475) </details> ## Xaml - Improved style inheritance by @kubaflo in #31317 <details> <summary>🔧 Fixes</summary> - [Styles based on a style that is based on another style that uses AppThemeBinding do not inherit properties correctly.](#31280) </details> - Fix for VisualStateManager Setter.TargetName failing when ControlTemplate is applied by @BagavathiPerumal in #33208 <details> <summary>🔧 Fixes</summary> - [Setter.TargetName + ControlTemplate crash](#26977) </details> <details> <summary>🧪 Testing (4)</summary> - [Testing] Additional Feature Matrix Event Test Cases for Slider and ScrollView by @nivetha-nagalingam in #34352 - [Testing] Fixed Build error on inflight/ candidate PR 34885 by @NafeelaNazhir in #34891 - [Testing] Fixed UI test image failure in PR 34885 - [13/4/2026] by @NafeelaNazhir in #34933 - Fixed test failure - CursorPositionUpdatesWhenSearchBarGainsFocus by @Dhivya-SF4094 in #34938 </details> <details> <summary>📦 Other (3)</summary> - Fix Loaded event not called for MAUI View added to native View by @NirmalKumarYuvaraj in #34345 <details> <summary>🔧 Fixes</summary> - [Loaded event not called for MAUI View added to native View](#34310) </details> - Add public IAlertManager and IAlertManagerSubscription interfaces by @Redth in #34228 <details> <summary>🔧 Fixes</summary> - [Alert/Dialog system (`DisplayAlert`, `DisplayActionSheet`, `DisplayPromptAsync`) needs a public extensibility point](#34104) </details> - Fix crash when displaying alerts on unloaded pages by @kubaflo in #33288 </details> <details> <summary>📝 Issue References</summary> Fixes #5825, Fixes #8494, Fixes #8716, Fixes #10987, Fixes #11404, Fixes #12008, Fixes #18200, Fixes #18551, Fixes #18657, Fixes #18701, Fixes #19168, Fixes #19209, Fixes #20062, Fixes #20348, Fixes #20834, Fixes #20991, Fixes #21983, Fixes #22038, Fixes #22193, Fixes #22197, Fixes #22769, Fixes #23330, Fixes #23854, Fixes #23902, Fixes #23921, Fixes #24304, Fixes #24831, Fixes #25124, Fixes #26059, Fixes #26397, Fixes #26644, Fixes #26846, Fixes #26961, Fixes #26977, Fixes #27086, Fixes #27367, Fixes #27959, Fixes #28337, Fixes #28351, Fixes #28660, Fixes #28975, Fixes #29390, Fixes #29391, Fixes #29463, Fixes #29493, Fixes #29544, Fixes #30052, Fixes #30065, Fixes #30071, Fixes #30144, Fixes #30399, Fixes #30779, Fixes #30803, Fixes #30970, Fixes #31280, Fixes #31446, Fixes #31475, Fixes #31496, Fixes #31565, Fixes #31825, Fixes #31961, Fixes #32048, Fixes #32050, Fixes #32139, Fixes #32356, Fixes #32419, Fixes #32771, Fixes #32944, Fixes #32984, Fixes #32994, Fixes #33308, Fixes #33501, Fixes #33703, Fixes #33770, Fixes #33773, Fixes #34104, Fixes #34256, Fixes #34257, Fixes #34310, Fixes #34322, Fixes #34363, Fixes #34370, Fixes #34459, Fixes #34518, Fixes #34583, Fixes #34591, Fixes #34666, Fixes #34693, Fixes #34720, Fixes #34730 </details> **Full Changelog**: main...inflight/candidate
Note
Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!
Issue details
FlyoutPage on Windows did not update its layout when the CollapseStyle property changed at runtime.
Description of Change
This update enables dynamic support for the CollapseStyle property in FlyoutPage on Windows. It allows the flyout pane to update at runtime when the property changes,
Issues Fixed
Fixes #18200
Tested the behavior in the following platforms.
Without-Fix.mp4
With-Fix.mp4