[Testing] Feature Matrix UITest Cases for Triggers#34152
[Testing] Feature Matrix UITest Cases for Triggers#34152kubaflo merged 12 commits intodotnet:inflight/currentfrom
Conversation
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
There was a problem hiding this comment.
Pull request overview
This pull request introduces a comprehensive "Triggers Feature Matrix" to the .NET MAUI test suite, providing both demonstration and testing capabilities for 10 different trigger types in MAUI. The implementation includes a well-structured HostApp demonstration page with XAML-based examples, a robust ViewModel with supporting converters and trigger actions, and comprehensive NUnit/Appium UI tests with screenshot verification.
Changes:
- Added new Triggers Feature Matrix gallery entry accessible from the main navigation
- Implemented TriggersControlPage with XAML and code-behind for 10 trigger type demonstrations
- Created TriggersViewModel with INotifyPropertyChanged support and helper converters/actions
- Added 17 NUnit UI tests with screenshot verification for trigger functionality
- Updated UI test pipeline configuration to include the new "Triggers" category
Reviewed changes
Copilot reviewed 9 out of 41 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| UITestCategories.cs | Added new "Triggers" constant for test categorization |
| TriggersFeatureTests.cs | Comprehensive UI test suite with 17 tests covering all trigger types |
| TriggersViewModel.cs | ViewModel with properties, converters, trigger actions, and enum definitions |
| TriggersOptionsPage.xaml/.cs | Options page for selecting trigger types to demonstrate |
| TriggersControlPage.xaml/.cs | Main page with 10 trigger demonstrations and event handlers |
| CorePageView.cs | Added gallery entry for Triggers Feature Matrix |
| ui-tests.yml | Added "Triggers" category to pipeline test execution |
| PropertyTrigger_Focused.png | Android screenshot baseline for focused state |
| PropertyTrigger_UnFocused.png | Android screenshot baseline for unfocused state |
src/Controls/tests/TestCases.HostApp/FeatureMatrix/Triggers/TriggersViewModel.cs
Outdated
Show resolved
Hide resolved
src/Controls/tests/TestCases.HostApp/FeatureMatrix/Triggers/TriggersViewModel.cs
Outdated
Show resolved
Hide resolved
src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TriggersFeatureTests.cs
Outdated
Show resolved
Hide resolved
src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TriggersFeatureTests.cs
Outdated
Show resolved
Hide resolved
src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TriggersFeatureTests.cs
Outdated
Show resolved
Hide resolved
src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TriggersFeatureTests.cs
Outdated
Show resolved
Hide resolved
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 34152Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 34152" |
🤖 AI Summary📊 Expand Full Review🔍 Pre-Flight — Context & Validation📝 Review Session — Added ios26 Snapshots ·
|
| Test | iOS | Android | Windows | Catalyst |
|---|---|---|---|---|
| ( | automation) | OrientationStateTrigger | ||
| AdaptiveTrigger ( | screenshot | ) | ||
| AdaptiveTriggerVerifiesElements | ||||
| DeviceStateTrigger | ||||
| All others |
Reviewer Feedback (Copilot Bot)
All 6 Copilot suggestions were addressed by the author:
returns
returns
3. Comment spacing fix at line 204
4. Comment indentation fix at line 221
can be passed
6. Grammar fix in platform exclusion comment
Fix Candidates Table
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #34152 | Add Triggers Feature Matrix with 17 UI PENDING (Gate) | 41 files | Pure test addition | tests |
🚦 Gate — Test Verification
📝 Review Session — Added ios26 Snapshots · da58a7c
Result PASSED:
Platform: ios (iPhone Xs Simulator, iOS 18.6)
Mode: Pass-only verification (pure test addition PR - no fix to revert)
Test Results
All 17 tests passed:
| Test | Result | Duration |
|---|---|---|
| PropertyTriggerChangesBackgroundOnFocus Passed | 4s | |
| DataTriggerEnablesButtonWhenTextEntered Passed | 4s | |
| EventTriggerValidatesNumericInput Passed | 6s | |
| StateTriggerChangesBackgroundOnToggle Passed | 2s | |
| CompareStateTriggerChangesBackgroundOnCheck Passed | 2s | |
| DeviceStateTriggerShowsPlatformSpecificBackground Passed | 2s | |
| OrientationStateTriggerShowsCorrectBackground Passed | 2s | |
| AdaptiveTriggerChangesOrientation Passed | 3s | |
| MultiTriggerComplexConditions Passed | 10s | |
| EnterExitActionsTriggerEntryFocusUnfocus Passed | 3s | |
| DataTriggerVerifiesButtonTextAndEntryInput Passed | 5s | |
| EventTriggerVerifiesEntryInput Passed | 6s | |
| MultiTriggerVerifiesFieldsAndSubmitButton Passed | 8s | |
| StateTriggerVerifiesGridLabelTextAfterToggle Passed | 3s | |
| CompareStateTriggerVerifiesLabelAfterCheckToggle Passed | 3s | |
| PropertyTriggerVerifiesEntryFocusInteraction Passed | 3s | |
| AdaptiveTriggerVerifiesWindowSizeLabelAndElements Passed | 2s |
Passed: 17 / 17
Notes
This is a pure test addition PR (no bug fix). Normal "fail without fix / pass with fix" verification doesn't apply. Tests were verified to PASS with the current PR code, confirming the test infrastructure is correctly implemented and all trigger demonstrations work.
🔧 Fix — Analysis & Comparison
📝 Review Session — Added ios26 Snapshots · da58a7c
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #34152 | Add Triggers Feature Matrix with 17 UI tests for 10 trigger types PASS (Gate) | 41 files | Pure test addition - no bug fix |
Exhausted: N/A
Selected Fix: PR's approach - This is a pure test addition PR. There is no bug fix to improve upon or replace. try-fix exploration is not applicable.
Reason try-fix was skipped
This PR adds new test coverage (HostApp pages + UI tests) for MAUI trigger functionality. There is no existing bug being fixed. The try-fix skill requires:
- A broken baseline (reverting a bug fix to get failing tests)
- Alternative fix ideas to explore
Neither applies here. The Gate verification confirmed all 17 tests pass with the current code.
📋 Report — Final Recommendation
📝 Review Session — Added ios26 Snapshots · da58a7c
Final Recommendation: APPROVE
Summary
PR #34152 adds a comprehensive "Triggers Feature Matrix" to the MAUI test suite, covering all 10 major MAUI trigger types with 17 NUnit UI tests and screenshot baselines for Android, iOS, Mac, and Windows. This is a pure test addition PR (community contribution from Syncfusion) with no bug fix involved.
Gate All 17 tests passed on iOS (iPhone Xs, iOS 18.6)PASSED :
What Was Tested
- 10 trigger types: PropertyTrigger, DataTrigger, EventTrigger, MultiTrigger, EnterActions/ExitActions, StateTrigger, AdaptiveTrigger, CompareStateTrigger, DeviceStateTrigger, OrientationStateTrigger
- 17 tests covering both screenshot verification and behavioral assertions
- Platform: iOS (as specified; Android/Mac/Windows snapshots also included in PR)
Root Cause
N/ This PR adds new test coverage, not a bug fix.A
Fix Quality
The test infrastructure is well-implemented:
Strengths:
- Follows established
NavigationPage-based FeatureMatrix pattern (consistent with BorderControlPage, ButtonControlPage, etc.) - Uses
UITestEntry(cursor-hidden) for stable screenshot comparisons - Proper event subscription/unsubscription in
OnAppearing/OnDisappearing VerifyScreenshotOrSetExceptioncollects failures across multi-step tests- State reset logic when returning from options (
_isReturningFromOptionsflag +ViewModel.Reset()) Binding.DoNothingreturned from one-way converterConvertBackmethods- Platform exclusions via
#if TEST_FAILS_ON_*match established patterns - All 6 Copilot review suggestions addressed by the author
Minor Observations (non-blocking):
-
OrientationStateTrigger excluded on Android without issue The
#if TEST_FAILS_ON_ANDROIDcomment says "currently failing on Android in Automation, but can be passed manually." Most#if TEST_FAILS_ON_*exclusions in the codebase reference a GitHub tracking issue. Consider adding one to track the Android automation failure.link -
No orientation cleanup on test
AdaptiveTriggerChangesOrientationcallsApp.SetOrientationLandscape()but only restores portrait at the end (not in a finally block). If the test throws between the two orientation calls, subsequent tests run in landscape. This matches patterns elsewhere in the codebase but could cause test flakiness.exception -
XAML Title is " The
TriggersControlMainPageXAML hasTitle="TriggersControlPage"instead of something more user-friendly like "Triggers Feature Matrix". This is cosmetic only and doesn't affect tests.TriggersControlPage"
Try-Fix Results
Not This is a pure test addition PR with no bug fix to compare against.applicable
PR Title & Description Accuracy
The PR title "[Testing] Feature Matrix UITest Cases for Triggers" accurately reflects the implementation. The description correctly describes all new components added.
Conclusion
The implementation is thorough, consistent with established FeatureMatrix patterns, and all tests pass on iOS. The community contribution demonstrates good understanding of the MAUI test infrastructure. The minor observations are informational and don't block merge.
📋 Expand PR Finalization Review
Title: ✅ Good
Current: [Testing] Feature Matrix UITest Cases for Triggers
Description: ✅ Good
Description needs updates. See details below.
Code Review: ✅ Passed
Code Review – PR #34152: Triggers Feature Matrix UI Tests
🟡 Suggestions
1. PropertyChanged event not declared nullable
File: src/Controls/tests/TestCases.HostApp/FeatureMatrix/Triggers/TriggersViewModel.cs
// Current
public event PropertyChangedEventHandler PropertyChanged;
// Should be
public event PropertyChangedEventHandler? PropertyChanged;The event is invoked with the null-conditional operator (?.Invoke), but the declaration itself is not marked nullable. With nullable reference types enabled, this can produce a CS8618 warning. Declaring it as PropertyChangedEventHandler? is the correct pattern.
2. PushAsync called without await in constructor
File: src/Controls/tests/TestCases.HostApp/FeatureMatrix/Triggers/TriggersControlPage.xaml.cs
public TriggersControlPage()
{
_viewModel = new TriggersViewModel();
PushAsync(new TriggersControlMainPage(_viewModel)); // fire-and-forget
}Calling PushAsync in a constructor without await is a fire-and-forget async operation. While this is an established MAUI pattern for NavigationPage subclasses and works in practice, any exceptions during navigation are silently swallowed. This is very common in the codebase (many existing feature matrix pages use this same pattern), so it's low-risk here, but worth noting.
3. Inline #if in test helper methods
File: src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TriggersFeatureTests.cs
private void VerifyScreenshotOrSetExceptionWithCroppingBottom(ref Exception? exception, string? name = null, bool isKeyBoardNotShown = false)
{
#if IOS
VerifyScreenshotOrSetException(ref exception, name, cropBottom: CropBottomValue, tolerance: 0.5, retryTimeout: TimeSpan.FromSeconds(2));
#elif ANDROID
if (isKeyBoardNotShown)
VerifyScreenshotOrSetException(ref exception, name, tolerance: 0.5, retryTimeout: TimeSpan.FromSeconds(2));
else
VerifyScreenshotOrSetException(ref exception, name, cropBottom: CropBottomValue, tolerance: 0.5, retryTimeout: TimeSpan.FromSeconds(2));
#else
VerifyScreenshotOrSetException(ref exception, name, tolerance: 0.5, retryTimeout: TimeSpan.FromSeconds(2));
#endif
}The UI testing guidelines discourage inline #if directives, preferring platform-specific logic in extension methods. However, here the #if is in private helper methods (not test method bodies), which is an acceptable compromise – it keeps the test method bodies clean and readable. No action required, but be consistent with this pattern across the feature matrix tests.
4. Missing newline at end of UITestCategories.cs
File: src/Controls/tests/TestCases.Shared.Tests/UITestCategories.cs
The diff shows \ No newline at end of file. The file should end with a newline. This is a minor style issue that can be fixed trivially.
5. OrientationStateTriggerShowsCorrectBackground only runs on iOS
File: src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/TriggersFeatureTests.cs
#if TEST_FAILS_ON_CATALYST && TEST_FAILS_ON_WINDOWS
#if TEST_FAILS_ON_ANDROID // excluded from Android, Catalyst, Windows → iOS only
[Test]
[Order(7)]
public void OrientationStateTriggerShowsCorrectBackground()The comment says "failing on Android in Automation, but can be passed manually." This means the test only runs on iOS. The comment makes the reasoning clear, which is good. No action required – document this known limitation so it can be revisited when the Android issue is resolved.
6. TriggersControlPage and TriggersControlMainPage naming could be confusing
File: src/Controls/tests/TestCases.HostApp/FeatureMatrix/Triggers/TriggersControlPage.xaml.cs
TriggersControlPage is a NavigationPage wrapper; TriggersControlMainPage is the actual ContentPage content. The XAML file is named TriggersControlPage.xaml but its x:Class is TriggersControlMainPage. This is slightly confusing – the file name suggests a single page but it contains two classes. Consider splitting into separate files in a follow-up, or at least adding a comment explaining the architecture.
✅ Looks Good
[Category(UITestCategories.Triggers)]at class level – correct per guidelines; no per-test category attribute needed.- Snapshot coverage – snapshots provided for all 4 platforms (Android, iOS, iOS-26, Mac, Windows).
OnAppearing/OnDisappearingevent management –DeviceDisplay.Current.MainDisplayInfoChangedandSizeChangedare properly subscribed and unsubscribed, preventing memory leaks.SelectTriggerTypehelper method – clean, reusable navigation helper used by all tests.retryTimeout: TimeSpan.FromSeconds(2)on all screenshot assertions – follows best practices for handling animation timing.VerifyScreenshotOrSetExceptionpattern – uses the deferred-exception pattern (collect, then throw) correctly to ensure all screenshots are captured before failing.- Gallery registration in
CorePageView.cs– correct single-line addition following existing pattern. ui-tests.ymlcategory registration –Triggersadded to the test run matrix correctly.- 10 trigger types covered – PropertyTrigger, DataTrigger, EventTrigger, MultiTrigger, EnterExitActions, StateTrigger, AdaptiveTrigger, CompareStateTrigger, DeviceStateTrigger, OrientationStateTrigger.
Reset()called on returning from options – proper state cleanup between test runs.
> [!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! This pull request introduces a new "Triggers Feature Matrix" to the test cases host app, providing a comprehensive set of pages and view models to explore, demonstrate, and test various trigger types in .NET MAUI. The main changes include the addition of new pages for triggers, a robust view model supporting multiple trigger types, supporting converters and trigger actions, and updates to the test categories. **New Triggers Feature Matrix:** * Added a new entry for "Triggers Feature Matrix" to the list of gallery pages in `CorePageView.cs`, making the new triggers demo accessible from the app's main navigation. * Introduced `TriggersControlPage`, `TriggersControlMainPage`, and `TriggersOptionsPage` (with XAML and code-behind), providing navigation, UI, and options for selecting and demonstrating 10 different trigger types. This includes logic for resetting state, updating UI based on device orientation and platform, and handling navigation between pages. [[1]](diffhunk://#diff-1dde92fa5a7e0d1c1d00111a09fd845128921d83f8a216b79e8ca98e0c9d5ec4R1-R130) [[2]](diffhunk://#diff-d5e0662fcb71eae9f1ae11ee4b76fff6d2f6fe22fc10d45dff8b49d03b0c4872R1-R73) [[3]](diffhunk://#diff-e909c23c4947e1bd055b69ba2a4dcf17b6844f25b3b719050f406ca602948024R1-R29) * Added `TriggersViewModel` to manage state and behavior for all trigger demos, including properties for each trigger type, input validation, and reset logic. Also introduced several value converters and trigger actions (e.g., `FadeTriggerAction`, `NumericValidationTriggerAction`, and string converters) to support advanced trigger scenarios in the UI. * Added a new test category constant `Triggers` to `UITestCategories`, enabling automated or manual test tagging for the new triggers feature matrix. These changes collectively provide a robust foundation for testing and demonstrating trigger functionality in the MAUI controls test suite. https://github.com/user-attachments/assets/25c3652b-e1bf-4922-a606-e68459543f9d --------- Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
> [!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! This pull request introduces a new "Triggers Feature Matrix" to the test cases host app, providing a comprehensive set of pages and view models to explore, demonstrate, and test various trigger types in .NET MAUI. The main changes include the addition of new pages for triggers, a robust view model supporting multiple trigger types, supporting converters and trigger actions, and updates to the test categories. **New Triggers Feature Matrix:** * Added a new entry for "Triggers Feature Matrix" to the list of gallery pages in `CorePageView.cs`, making the new triggers demo accessible from the app's main navigation. * Introduced `TriggersControlPage`, `TriggersControlMainPage`, and `TriggersOptionsPage` (with XAML and code-behind), providing navigation, UI, and options for selecting and demonstrating 10 different trigger types. This includes logic for resetting state, updating UI based on device orientation and platform, and handling navigation between pages. [[1]](diffhunk://#diff-1dde92fa5a7e0d1c1d00111a09fd845128921d83f8a216b79e8ca98e0c9d5ec4R1-R130) [[2]](diffhunk://#diff-d5e0662fcb71eae9f1ae11ee4b76fff6d2f6fe22fc10d45dff8b49d03b0c4872R1-R73) [[3]](diffhunk://#diff-e909c23c4947e1bd055b69ba2a4dcf17b6844f25b3b719050f406ca602948024R1-R29) * Added `TriggersViewModel` to manage state and behavior for all trigger demos, including properties for each trigger type, input validation, and reset logic. Also introduced several value converters and trigger actions (e.g., `FadeTriggerAction`, `NumericValidationTriggerAction`, and string converters) to support advanced trigger scenarios in the UI. * Added a new test category constant `Triggers` to `UITestCategories`, enabling automated or manual test tagging for the new triggers feature matrix. These changes collectively provide a robust foundation for testing and demonstrating trigger functionality in the MAUI controls test suite. https://github.com/user-attachments/assets/25c3652b-e1bf-4922-a606-e68459543f9d --------- Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
> [!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! This pull request introduces a new "Triggers Feature Matrix" to the test cases host app, providing a comprehensive set of pages and view models to explore, demonstrate, and test various trigger types in .NET MAUI. The main changes include the addition of new pages for triggers, a robust view model supporting multiple trigger types, supporting converters and trigger actions, and updates to the test categories. **New Triggers Feature Matrix:** * Added a new entry for "Triggers Feature Matrix" to the list of gallery pages in `CorePageView.cs`, making the new triggers demo accessible from the app's main navigation. * Introduced `TriggersControlPage`, `TriggersControlMainPage`, and `TriggersOptionsPage` (with XAML and code-behind), providing navigation, UI, and options for selecting and demonstrating 10 different trigger types. This includes logic for resetting state, updating UI based on device orientation and platform, and handling navigation between pages. [[1]](diffhunk://#diff-1dde92fa5a7e0d1c1d00111a09fd845128921d83f8a216b79e8ca98e0c9d5ec4R1-R130) [[2]](diffhunk://#diff-d5e0662fcb71eae9f1ae11ee4b76fff6d2f6fe22fc10d45dff8b49d03b0c4872R1-R73) [[3]](diffhunk://#diff-e909c23c4947e1bd055b69ba2a4dcf17b6844f25b3b719050f406ca602948024R1-R29) * Added `TriggersViewModel` to manage state and behavior for all trigger demos, including properties for each trigger type, input validation, and reset logic. Also introduced several value converters and trigger actions (e.g., `FadeTriggerAction`, `NumericValidationTriggerAction`, and string converters) to support advanced trigger scenarios in the UI. * Added a new test category constant `Triggers` to `UITestCategories`, enabling automated or manual test tagging for the new triggers feature matrix. These changes collectively provide a robust foundation for testing and demonstrating trigger functionality in the MAUI controls test suite. https://github.com/user-attachments/assets/25c3652b-e1bf-4922-a606-e68459543f9d --------- Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
> [!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! This pull request introduces a new "Triggers Feature Matrix" to the test cases host app, providing a comprehensive set of pages and view models to explore, demonstrate, and test various trigger types in .NET MAUI. The main changes include the addition of new pages for triggers, a robust view model supporting multiple trigger types, supporting converters and trigger actions, and updates to the test categories. **New Triggers Feature Matrix:** * Added a new entry for "Triggers Feature Matrix" to the list of gallery pages in `CorePageView.cs`, making the new triggers demo accessible from the app's main navigation. * Introduced `TriggersControlPage`, `TriggersControlMainPage`, and `TriggersOptionsPage` (with XAML and code-behind), providing navigation, UI, and options for selecting and demonstrating 10 different trigger types. This includes logic for resetting state, updating UI based on device orientation and platform, and handling navigation between pages. [[1]](diffhunk://#diff-1dde92fa5a7e0d1c1d00111a09fd845128921d83f8a216b79e8ca98e0c9d5ec4R1-R130) [[2]](diffhunk://#diff-d5e0662fcb71eae9f1ae11ee4b76fff6d2f6fe22fc10d45dff8b49d03b0c4872R1-R73) [[3]](diffhunk://#diff-e909c23c4947e1bd055b69ba2a4dcf17b6844f25b3b719050f406ca602948024R1-R29) * Added `TriggersViewModel` to manage state and behavior for all trigger demos, including properties for each trigger type, input validation, and reset logic. Also introduced several value converters and trigger actions (e.g., `FadeTriggerAction`, `NumericValidationTriggerAction`, and string converters) to support advanced trigger scenarios in the UI. * Added a new test category constant `Triggers` to `UITestCategories`, enabling automated or manual test tagging for the new triggers feature matrix. These changes collectively provide a robust foundation for testing and demonstrating trigger functionality in the MAUI controls test suite. https://github.com/user-attachments/assets/25c3652b-e1bf-4922-a606-e68459543f9d --------- Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
> [!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! This pull request introduces a new "Triggers Feature Matrix" to the test cases host app, providing a comprehensive set of pages and view models to explore, demonstrate, and test various trigger types in .NET MAUI. The main changes include the addition of new pages for triggers, a robust view model supporting multiple trigger types, supporting converters and trigger actions, and updates to the test categories. **New Triggers Feature Matrix:** * Added a new entry for "Triggers Feature Matrix" to the list of gallery pages in `CorePageView.cs`, making the new triggers demo accessible from the app's main navigation. * Introduced `TriggersControlPage`, `TriggersControlMainPage`, and `TriggersOptionsPage` (with XAML and code-behind), providing navigation, UI, and options for selecting and demonstrating 10 different trigger types. This includes logic for resetting state, updating UI based on device orientation and platform, and handling navigation between pages. [[1]](diffhunk://#diff-1dde92fa5a7e0d1c1d00111a09fd845128921d83f8a216b79e8ca98e0c9d5ec4R1-R130) [[2]](diffhunk://#diff-d5e0662fcb71eae9f1ae11ee4b76fff6d2f6fe22fc10d45dff8b49d03b0c4872R1-R73) [[3]](diffhunk://#diff-e909c23c4947e1bd055b69ba2a4dcf17b6844f25b3b719050f406ca602948024R1-R29) * Added `TriggersViewModel` to manage state and behavior for all trigger demos, including properties for each trigger type, input validation, and reset logic. Also introduced several value converters and trigger actions (e.g., `FadeTriggerAction`, `NumericValidationTriggerAction`, and string converters) to support advanced trigger scenarios in the UI. * Added a new test category constant `Triggers` to `UITestCategories`, enabling automated or manual test tagging for the new triggers feature matrix. These changes collectively provide a robust foundation for testing and demonstrating trigger functionality in the MAUI controls test suite. https://github.com/user-attachments/assets/25c3652b-e1bf-4922-a606-e68459543f9d --------- Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
## What's Coming .NET MAUI inflight/candidate introduces significant improvements across all platforms with focus on quality, performance, and developer experience. This release includes 66 commits with various improvements, bug fixes, and enhancements. ## Activityindicator - [Android] Implemented material3 support for ActivityIndicator by @Dhivya-SF4094 in #33481 <details> <summary>🔧 Fixes</summary> - [Implement material3 support for ActivityIndicator](#33479) </details> - [iOS] Fix: ActivityIndicator IsRunning ignores IsVisible when set to true by @bhavanesh2001 in #28983 <details> <summary>🔧 Fixes</summary> - [[iOS] [ActivityIndicator] `IsRunning` ignores `IsVisible` when set to `true`](#28968) </details> ## Button - [iOS] Button RTL text and image overlap - fix by @kubaflo in #29041 ## Checkbox - [iOS/MacCatalyst] Fix CheckBox foreground color not resetting when set to null by @Ahamed-Ali in #34284 <details> <summary>🔧 Fixes</summary> - [[iOS] Color of the checkBox control is not properly worked on dynamic scenarios](#34278) </details> ## CollectionView - [iOS] Fix: CollectionView does not clear selection when SelectedItem is set to null by @Tamilarasan-Paranthaman in #30420 <details> <summary>🔧 Fixes</summary> - [CollectionView not being able to remove selected item highlight on iOS](#30363) - [[MAUI] Select items traces are preserved](#26187) </details> - [iOS] CV2 ItemsLayout update by @kubaflo in #28675 <details> <summary>🔧 Fixes</summary> - [CollectionView CollectionViewHandler2 doesnt change ItemsLayout on DataTrigger](#28656) - [iOS CollectionView doesn't respect a change to ItemsLayout when using Items2.CollectionViewHandler2](#31259) </details> - [iOS][CV2] Fix CollectionView renders large empty space at bottom of view by @devanathan-vaithiyanathan in #31215 <details> <summary>🔧 Fixes</summary> - [[iOS] [MacCatalyst] CollectionView renders large empty space at bottom of view](#17799) - [[iOS/Mac] CollectionView2 EmptyView takes up large horizontal space even when the content is small](#33201) </details> - [iOS] Fixed issue where group Header/Footer template was set to all items when IsGrouped was true for an ObservableCollection by @Tamilarasan-Paranthaman in #29144 <details> <summary>🔧 Fixes</summary> - [[iOS] Group Header/Footer Repeated for All Items When IsGrouped is True for ObservableCollection in CollectionView](#29141) </details> - [Android] Fix CollectionView selection crash with HeaderTemplate by @NirmalKumarYuvaraj in #34275 <details> <summary>🔧 Fixes</summary> - [[Bug] [Android] System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index](#34247) </details> ## DateTimePicker - [iOS] Fix TimePicker AM/PM frequently changes when the app is closed and reopened by @devanathan-vaithiyanathan in #31066 <details> <summary>🔧 Fixes</summary> - [[iOS] TimePicker AM/PM frequently changes when the app is closed and reopened](#30837) - [Maui 10 iOS TimePicker Strange Characters in place of AM/PM](#33722) </details> - Android TimePicker ignores 24 hour system setting when using Format Property - fix by @kubaflo in #28797 <details> <summary>🔧 Fixes</summary> - [Android TimePicker ignores 24 hour system setting when using Format Property](#28784) </details> ## Drawing - [iOS, Mac, Windows] GraphicsView: Fix Background/BackgroundColor not updating by @NirmalKumarYuvaraj in #31254 <details> <summary>🔧 Fixes</summary> - [[iOS, Mac, Windows] GraphicsView does not change the Background/BackgroundColor](#31239) </details> - [iOS] GraphicsView DrawString - fix by @kubaflo in #26304 <details> <summary>🔧 Fixes</summary> - [DrawString not rendering in iOS.](#24450) - [GraphicsView DrawString not rendering in iOS](#8486) - [DrawString doesn't work on maccatalyst](#4993) </details> - [Android] - Fix Shadow Rendering For Transparent Fill, Stroke (Lines), and Text on Shapes by @prakashKannanSf3972 in #29528 <details> <summary>🔧 Fixes</summary> - [Ellipse Transparency Not Rendered When Drawing Arc Inside the Ellipse Using GraphicsView on Android](#29394) </details> - Revert "[iOS, Mac, Windows] GraphicsView: Fix Background/BackgroundColor not updating (#31254)" by @Ahamed-Ali via @Copilot in #34508 ## Entry - [iOS 26] Fix Entry MaxLength not enforced due to new multi-range delegate by @kubaflo in #32045 <details> <summary>🔧 Fixes</summary> - [iOS 26 - The MaxLength property value is not respected on an Entry control.](#32016) - [.NET MAUI Entry Maximum Length not working on iOS and macOS](#33316) </details> - [iOS] Fixed Entry with IsPassword toggling loses previously entered text by @SubhikshaSf4851 in #30572 <details> <summary>🔧 Fixes</summary> - [Entry with IsPassword toggling loses previously entered text on iOS when IsPassword is re-enabled](#30085) </details> ## Essentials - Fix for FilePicker PickMultipleAsync nullable reference type by @SuthiYuvaraj in #33163 <details> <summary>🔧 Fixes</summary> - [FilePicker PickMultipleAsync nullable reference type](#33114) </details> - Replace deprecated NetworkReachability with NWPathMonitor on iOS/macOS by @jfversluis via @Copilot in #32354 <details> <summary>🔧 Fixes</summary> - [NetworkReachability is obsolete on iOS/maccatalyst 17.4+](#32312) - [Use NWPathMonitor on iOS for Essentials Connectivity](#2574) </details> ## Essentials Connectivity - Update Android Connectivity implementation to use modern APIs by @jfversluis via @Copilot in #30348 <details> <summary>🔧 Fixes</summary> - [Update the Android Connectivity implementation to user modern APIs](#30347) </details> ## Flyout - [iOS] Fixed Flyout icon not updating when root page changes using InsertPageBefore by @Vignesh-SF3580 in #29924 <details> <summary>🔧 Fixes</summary> - [[iOS] Flyout icon not replaced by back button when root page is changed using InsertPageBefore](#29921) </details> ## Flyoutpage - [iOS] Flyout Items Not Displayed in RightToLeft FlowDirection in Landscape - fix by @kubaflo in #26762 <details> <summary>🔧 Fixes</summary> - [Flyout Items Not Displayed in RightToLeft FlowDirection on iOS in Landscape Orientation and Hamburger Icon Positioned Incorrectly](#26726) </details> ## Image - [Android] Implemented Material3 support for Image by @Dhivya-SF4094 in #33661 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Image](#33660) </details> ## Keyboard - [iOS] Fix gap at top of view after rotating device while Entry keyboard is visible by @praveenkumarkarunanithi in #34328 <details> <summary>🔧 Fixes</summary> - [Focusing and entering texts on entry control causes a gap at the top after rotating simulator.](#33407) </details> ## Label - [Android] Support for images inside HTML label by @kubaflo in #21679 <details> <summary>🔧 Fixes</summary> - [Label with HTML TextType does not display images on Android](#21044) </details> - [fix] ContentLabel Moved to a nested class to prevent CS0122 in external source generators by @SubhikshaSf4851 in #34514 <details> <summary>🔧 Fixes</summary> - [[MAUI] Building Maui App with sample content results CS0122 errors.](#34512) </details> ## Layout - Optimize ordering of children in Flex layout by @symbiogenesis in #21961 - [Android] Fix control size properties not available during Loaded event by @Vignesh-SF3580 in #31590 <details> <summary>🔧 Fixes</summary> - [CollectionView on Android does not provide height, width, logical children once loaded, works fine on Windows](#14364) - [Control's Loaded event invokes before calling its measure override method.](#14160) </details> ## Mediapicker - [iOS/Android] MediaPicker: Fix image orientation when RotateImage=true by @michalpobuta in #33892 <details> <summary>🔧 Fixes</summary> - [MediaPicker.PickPhotosAsync does not preserve image orientation](#32650) </details> ## Modal - [Windows] Fix modal page keyboard focus not shifting to newly opened modal by @jfversluis in #34212 <details> <summary>🔧 Fixes</summary> - [Keyboard focus does not shift to a newly opened modal page: Pressing enter clicks the button on the page beneath the modal page](#22938) </details> ## Navigation - [iOS26] Apply view margins in title view by @kubaflo in #32205 <details> <summary>🔧 Fixes</summary> - [NavigationPage TitleView iOS 26](#32200) </details> - [iOS] System.NullReferenceException at NavigationRenderer.SetStatusBarStyle() by @kubaflo in #29564 <details> <summary>🔧 Fixes</summary> - [System.NullReferenceException at NavigationRenderer.SetStatusBarStyle()](#29535) </details> - [iOS 26] Fix back button color not applied for NavigationPage by @Shalini-Ashokan in #34326 <details> <summary>🔧 Fixes</summary> - [[iOS] Color not applied to the Back button text or image on iOS 26](#33966) </details> ## Picker - Fix Picker layout on Mac Catalyst 26+ by @kubaflo in #33146 <details> <summary>🔧 Fixes</summary> - [[MacOS 26] Text on picker options are not centered on macOS 26.1](#33229) </details> ## Progressbar - [Android] Implemented Material3 support for ProgressBar by @SyedAbdulAzeemSF4852 in #33926 <details> <summary>🔧 Fixes</summary> - [Implement Material3 support for Progressbar](#33925) </details> ## RadioButton - [iOS, Mac] Fix for RadioButton TextColor for plain Content not working by @HarishwaranVijayakumar in #31940 <details> <summary>🔧 Fixes</summary> - [RadioButton: TextColor for plain Content not working on iOS](#18011) </details> - [All Platforms] Fix RadioButton warning when ControlTemplate is set with View content by @kubaflo in #33839 <details> <summary>🔧 Fixes</summary> - [Seeking clarification on RadioButton + ControlTemplate + Content documentation](#33829) </details> - Visual state change for disabled RadioButton by @kubaflo in #23471 <details> <summary>🔧 Fixes</summary> - [RadioButton disabled UI issue - iOS](#18668) </details> ## SafeArea - [Android] Fix for TabbedPage BottomNavigation BarBackgroundColor not extending to system navigation bar by @praveenkumarkarunanithi in #33428 <details> <summary>🔧 Fixes</summary> - [[Android] TabbedPage BottomNavigation BarBackgroundColor does not extend to system navigation bar area in Edge-to-Edge mode](#33344) </details> ## ScrollView - [Android] ScrollView: Fix HorizontalScrollBarVisibility not updating immediately at runtime by @SubhikshaSf4851 in #33528 <details> <summary>🔧 Fixes</summary> - [Runtime Scrollbar visibility not updating correctly on Android and macOS platforms.](#33400) </details> - Fixed crash when calling ItemsView.ScrollTo on unloaded CollectionView by @kubaflo in #25444 <details> <summary>🔧 Fixes</summary> - [App crashes when calling ItemsView.ScrollTo on unloaded CollectionView](#23014) </details> ## Shell - [Shell] Update logic for iOS large title display in ShellItemRenderer by @kubaflo in #33246 - [iOS][Shell] Fix navigation lifecycle and back button for More tab (>5 tabs) by @kubaflo in #27932 <details> <summary>🔧 Fixes</summary> - [OnAppearing and OnNavigatedTo does not work when using extended Tabbar (tabbar with more than 5 tabs) on IOS.](#27799) - [Shell.BackButtonBehavior does not work when using extended Tabbar (tabbar with more than 5 tabs)on IOS.](#27800) - [Shell TabBar More button causes ViewModel command binding disconnection on back navigation](#30862) - [Content page onappearing not firing if tabs are on the more tab on IOS](#31166) </details> - [iOS 26] Fix tab bar ghosting when navigating from modal to tabbed Shell content by @SubhikshaSf4851 in #34254 <details> <summary>🔧 Fixes</summary> - [[iOS] Tab bar ghosting issue on iOS 26 (liquid glass)](#34143) </details> - Fix for Shell tab visibility not updating when navigating back multiple pages by @BagavathiPerumal in #34403 <details> <summary>🔧 Fixes</summary> - [Changing Shell Tab Visibility when navigating back multiple pages ignores Shell Tab Visibility](#33351) </details> - [iOS/Mac] Fixed OnBackButtonPressed not firing for Shell Navigation Bar Button by @Dhivya-SF4094 in #34401 <details> <summary>🔧 Fixes</summary> - [[iOS] OnBackButtonPressed not firing for Shell Navigation Bar button](#34190) </details> ## Slider - [iOS] Fix for Slider ThumbImageSource is not centered properly on iOS 26 by @HarishwaranVijayakumar in #34019 <details> <summary>🔧 Fixes</summary> - [[iOS 26] Slider ThumbImageSource is not centered properly](#33967) </details> - [Android] Fix improper rendering of ThumbimageSource in Slider by @NirmalKumarYuvaraj in #34064 <details> <summary>🔧 Fixes</summary> - [[Slider] MAUI Slider thumb image is big on android](#13258) </details> ## Stepper - [iOS] Fix Stepper layout overlap in landscape on iOS 26 by @Vignesh-SF3580 in #34325 <details> <summary>🔧 Fixes</summary> - [[.NET10] D10 - Customize cursor position - Rotating simulator makes the button and label overlap](#34273) </details> ## SwipeView - [iOS] SwipeView: Honor FontImageSource.Color in SwipeItem icon by @kubaflo in #27389 <details> <summary>🔧 Fixes</summary> - [[iOS] SwipeView: SwipeItem.IconImageSource.FontImageSource color value not honored](#27377) </details> ## Switch - [Android] Fix Switch thumb shadow missing when ThumbColor is set by @Shalini-Ashokan in #33960 <details> <summary>🔧 Fixes</summary> - [Android Switch Control Thumb Shadow](#19676) </details> ## Toolbar - [iOS/Mac Catalyst 26] Fix Shell.ForegroundColor not applied to ToolbarItems by @SyedAbdulAzeemSF4852 in #34085 <details> <summary>🔧 Fixes</summary> - [[iOS26] Shell.ForegroundColor is not applied to ToolbarItems](#34083) </details> - [Android] VoiceOver on Toolbar Item by @kubaflo in #29596 <details> <summary>🔧 Fixes</summary> - [VoiceOver on Toolbar Item](#29573) - [SemanticProperties do not work on ToolbarItems](#23623) </details> <details> <summary>🧪 Testing (11)</summary> - [Testing] Additional Feature Matrix Test Cases for CollectionView by @TamilarasanSF4853 in #32432 - [Testing] Feature Matrix UITest Cases for VisualStateManager by @LogishaSelvarajSF4525 in #34146 - [Testing] Feature Matrix UITest Cases for Clip by @TamilarasanSF4853 in #34121 - [Testing] Feature matrix UITest Cases for Map Control by @HarishKumarSF4517 in #31656 - [Testing] Feature matrix UITest Cases for Visual Transform Control by @HarishKumarSF4517 in #32799 - [Testing] Feature Matrix UITest Cases for Shell Pages by @NafeelaNazhir in #33945 - [Testing] Feature Matrix UITest Cases for Triggers by @HarishKumarSF4517 in #34152 - [Testing] Refactoring Feature Matrix UITest Cases for CheckBox Control by @LogishaSelvarajSF4525 in #34283 - Resolve UI test Build Sample failures - Candidate March 16 by @Ahamed-Ali in #34442 - Fix the failures in the Candidate branch- March 16 by @Ahamed-Ali in #34453 <details> <summary>🔧 Fixes</summary> - [March 16th, Candidate](#34437) </details> - Fixed the iOS 18.5 Candidate failures (March 16,2026) by @Ahamed-Ali in #34593 <details> <summary>🔧 Fixes</summary> - [March 16th, Candidate](#34437) </details> </details> <details> <summary>📦 Other (2)</summary> - Fixed candidate test failures caused by PR #33428. by @Ahamed-Ali in #34515 <details> <summary>🔧 Fixes</summary> - [[.NET10] On Android, there's a big space at the top for I, M and N2 & N3](#34509) </details> - Revert "[iOS] Button RTL text and image overlap - fix (#29041)" in b0497af </details> <details> <summary>📝 Issue References</summary> Fixes #2574, Fixes #4993, Fixes #8486, Fixes #13258, Fixes #14160, Fixes #14364, Fixes #17799, Fixes #18011, Fixes #18668, Fixes #19676, Fixes #21044, Fixes #22938, Fixes #23014, Fixes #23623, Fixes #24450, Fixes #26187, Fixes #26726, Fixes #27377, Fixes #27799, Fixes #27800, Fixes #28656, Fixes #28784, Fixes #28968, Fixes #29141, Fixes #29394, Fixes #29535, Fixes #29573, Fixes #29921, Fixes #30085, Fixes #30347, Fixes #30363, Fixes #30837, Fixes #30862, Fixes #31166, Fixes #31239, Fixes #31259, Fixes #32016, Fixes #32200, Fixes #32312, Fixes #32650, Fixes #33114, Fixes #33201, Fixes #33229, Fixes #33316, Fixes #33344, Fixes #33351, Fixes #33400, Fixes #33407, Fixes #33479, Fixes #33660, Fixes #33722, Fixes #33829, Fixes #33925, Fixes #33966, Fixes #33967, Fixes #34083, Fixes #34143, Fixes #34190, Fixes #34247, Fixes #34273, Fixes #34278, Fixes #34437, Fixes #34509, Fixes #34512 </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](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! This pull request introduces a new "Triggers Feature Matrix" to the test cases host app, providing a comprehensive set of pages and view models to explore, demonstrate, and test various trigger types in .NET MAUI. The main changes include the addition of new pages for triggers, a robust view model supporting multiple trigger types, supporting converters and trigger actions, and updates to the test categories. **New Triggers Feature Matrix:** * Added a new entry for "Triggers Feature Matrix" to the list of gallery pages in `CorePageView.cs`, making the new triggers demo accessible from the app's main navigation. * Introduced `TriggersControlPage`, `TriggersControlMainPage`, and `TriggersOptionsPage` (with XAML and code-behind), providing navigation, UI, and options for selecting and demonstrating 10 different trigger types. This includes logic for resetting state, updating UI based on device orientation and platform, and handling navigation between pages. [[1]](diffhunk://#diff-1dde92fa5a7e0d1c1d00111a09fd845128921d83f8a216b79e8ca98e0c9d5ec4R1-R130) [[2]](diffhunk://#diff-d5e0662fcb71eae9f1ae11ee4b76fff6d2f6fe22fc10d45dff8b49d03b0c4872R1-R73) [[3]](diffhunk://#diff-e909c23c4947e1bd055b69ba2a4dcf17b6844f25b3b719050f406ca602948024R1-R29) * Added `TriggersViewModel` to manage state and behavior for all trigger demos, including properties for each trigger type, input validation, and reset logic. Also introduced several value converters and trigger actions (e.g., `FadeTriggerAction`, `NumericValidationTriggerAction`, and string converters) to support advanced trigger scenarios in the UI. * Added a new test category constant `Triggers` to `UITestCategories`, enabling automated or manual test tagging for the new triggers feature matrix. These changes collectively provide a robust foundation for testing and demonstrating trigger functionality in the MAUI controls test suite. https://github.com/user-attachments/assets/25c3652b-e1bf-4922-a606-e68459543f9d --------- Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
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!
This pull request introduces a new "Triggers Feature Matrix" to the test cases host app, providing a comprehensive set of pages and view models to explore, demonstrate, and test various trigger types in .NET MAUI. The main changes include the addition of new pages for triggers, a robust view model supporting multiple trigger types, supporting converters and trigger actions, and updates to the test categories.
New Triggers Feature Matrix:
Added a new entry for "Triggers Feature Matrix" to the list of gallery pages in
CorePageView.cs, making the new triggers demo accessible from the app's main navigation.Introduced
TriggersControlPage,TriggersControlMainPage, andTriggersOptionsPage(with XAML and code-behind), providing navigation, UI, and options for selecting and demonstrating 10 different trigger types. This includes logic for resetting state, updating UI based on device orientation and platform, and handling navigation between pages. [1] [2] [3]Added
TriggersViewModelto manage state and behavior for all trigger demos, including properties for each trigger type, input validation, and reset logic. Also introduced several value converters and trigger actions (e.g.,FadeTriggerAction,NumericValidationTriggerAction, and string converters) to support advanced trigger scenarios in the UI.Added a new test category constant
TriggerstoUITestCategories, enabling automated or manual test tagging for the new triggers feature matrix.These changes collectively provide a robust foundation for testing and demonstrating trigger functionality in the MAUI controls test suite.
Screen.Recording.2026-02-20.at.6.00.55.PM.mov