Skip to content

Experimental interface IBehavior#32350

Open
stephenquan wants to merge 2 commits into
dotnet:net11.0from
stephenquan:feature/ibehaviors
Open

Experimental interface IBehavior#32350
stephenquan wants to merge 2 commits into
dotnet:net11.0from
stephenquan:feature/ibehaviors

Conversation

@stephenquan

@stephenquan stephenquan commented Nov 3, 2025

Copy link
Copy Markdown

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!

Description of Change

Note

DISCLAIMER: This PR is for continued discussion only.

This PR is marked as experimental in the title of the PR. Reviewers please be are aware this should not be merged into a minor version or service release branch.

These changes include a breaking API change as IAttachedObject is being made public and VisualElement.Behaviors type is changing from IList<Behavior> to IList<IBehavior>.

Doing so will enable behaviors to be assigned to anything (including VisualElement).

Pull Request Overview (Generated by Copilot):
This PR introduces an experimental IBehavior interface in .NET MAUI to enable behaviors to be assigned to any object, not just those constrained by the concrete Behavior class. The change allows behaviors to inherit from VisualElement while implementing IBehavior, potentially enabling DynamicResource functionality through access to the ResourceDictionary.

Key Changes (Generated by Copilot):

  • Introduces public IBehavior and IBehavior<T> interfaces
  • Makes IAttachedObject interface public (previously internal)
  • Updates VisualElement.Behaviors property type from IList<Behavior> to IList<IBehavior>

Reviewed Changes (Generated by Copilot):

File Description
src/Controls/src/Core/VisualElement/VisualElement.cs Changed Behaviors property type from IList<Behavior> to IList<IBehavior>
src/Controls/src/Core/Interactivity/IBehavior.cs Added new IBehavior and IBehavior<T> interfaces
src/Controls/src/Core/Interactivity/IAttachedObject.cs Changed IAttachedObject visibility from internal to public
src/Controls/src/Core/Interactivity/Behavior.cs Updated Behavior and Behavior<T> to implement IBehavior and IBehavior<T> respectively
src/Controls/src/Core/PublicAPI/*/PublicAPI.Shipped.txt Updated public API surface to reflect new interfaces and changed signatures

Issues Fixed

Fixes #

@dotnet-policy-service dotnet-policy-service Bot added the community ✨ Community Contribution label Nov 3, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@stephenquan stephenquan marked this pull request as ready for review November 3, 2025 08:38
Copilot AI review requested due to automatic review settings November 3, 2025 08:38

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

This PR introduces an experimental IBehavior interface in .NET MAUI to enable behaviors to be assigned to any object, not just those constrained by the concrete Behavior class. The change allows behaviors to inherit from VisualElement while implementing IBehavior, potentially enabling DynamicResource functionality through access to the ResourceDictionary.

Key Changes:

  • Introduces public IBehavior and IBehavior<T> interfaces
  • Makes IAttachedObject interface public (previously internal)
  • Updates VisualElement.Behaviors property type from IList<Behavior> to IList<IBehavior>

Reviewed Changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/Controls/src/Core/VisualElement/VisualElement.cs Changed Behaviors property type from IList<Behavior> to IList<IBehavior>
src/Controls/src/Core/Interactivity/IBehavior.cs Added new IBehavior and IBehavior<T> interfaces
src/Controls/src/Core/Interactivity/IAttachedObject.cs Changed IAttachedObject visibility from internal to public
src/Controls/src/Core/Interactivity/Behavior.cs Updated Behavior and Behavior<T> to implement IBehavior and IBehavior<T> respectively
src/Controls/src/Core/PublicAPI/*/PublicAPI.Shipped.txt Updated public API surface to reflect new interfaces and changed signatures

Comment thread src/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Shipped.txt
Comment thread src/Controls/src/Core/Interactivity/IBehavior.cs
Comment thread src/Controls/src/Core/Interactivity/IBehavior.cs
Comment thread src/Controls/src/Core/Interactivity/IAttachedObject.cs
@jsuarezruiz

Copy link
Copy Markdown
Contributor

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

@stephenquan

Copy link
Copy Markdown
Author

The last automated tests had 133 successful checks, but 30 failing tests. When I checked some of the failed test logs such as https://dev.azure.com/xamarin/public/_build/results?buildId=153239&view=logs&j=ac32be84-f58b-5440-705b-7d86d454906c&t=547eb81a-2da0-5d4e-f32b-53e5cde9624a it reports:

Error: System.Exception: The emulator did not finish booting in time.

The failed tests aren't specific to the PR but a problem with the test itself.

@jsuarezruiz jsuarezruiz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The test GenericsIssue test is failing in Runtime, SourceGen and XamlC.

System.Reflection.TargetException : Object type System.Collections.Generic.ICollection1[Microsoft.Maui.Controls.IBehavior] does not match target type Microsoft.Maui.Controls.AttachedCollection1[Microsoft.Maui.Controls.Behavior].

Could you review it?

@stephenquan stephenquan requested a review from Copilot November 12, 2025 04:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comment thread src/Controls/src/Core/VisualElement/VisualElement.cs
@stephenquan

Copy link
Copy Markdown
Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Commenter does not have sufficient privileges for PR 32350 in repo dotnet/maui

@stephenquan

Copy link
Copy Markdown
Author

I pushed a new commit af3d837 (above) addressing the test GenericsIssue test.

@MauiBot

MauiBot commented Mar 22, 2026

Copy link
Copy Markdown
Collaborator

🤖 AI Summary

📊 Expand Full Reviewaf3d837 · Enable AttachedCollection
🔍 Pre-Flight — Context & Validation

Issue: #23578 - Behavior bindable property with DynamicResource not supported?
PR: #32350 - Experimental interface IBehavior
Platforms Affected: Cross-platform XAML/Controls behavior surface (Android selected for Gate)
Files Changed: 12 implementation, 0 test

Key Findings

  • The PR is explicitly marked experimental and introduces a breaking API change by making IAttachedObject public and changing VisualElement.Behaviors from IList<Behavior> to IList<IBehavior>.
  • The linked issue is an open XAML/behavior limitation around DynamicResource support on behaviors; comments also include opposition to making behaviors stateful/visual-element-like.
  • No UI, unit, device, or XAML test files are included in the PR diff, so Gate must rely on existing repository tests rather than PR-added coverage.
  • Review discussion flagged a failing existing test (GenericsIssue) caused by the generic collection type change; the author later pushed a follow-up commit claiming to address it.
  • No prior agent review output matching the PR-review phase table format was found.

Edge Cases Mentioned in Discussion

  • Behavior support for DynamicResource depends on access to resource dictionaries / visual-tree context.
  • Reviewers raised branch/versioning concerns because this is a breaking API and should not land in a servicing branch.
  • Existing generic/XAML reflection-based tests are sensitive to the IList<Behavior> -> IList<IBehavior> change.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #32350 Introduce public IBehavior / IBehavior<T>, make IAttachedObject public, and widen VisualElement.Behaviors to IList<IBehavior> ⏳ PENDING (Gate) src/Controls/src/Core/Interactivity/AttachedCollection.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/Interactivity/IBehavior.cs, src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/PublicAPI/*/PublicAPI.Shipped.txt Original PR; no new tests in diff

🚦 Gate — Test Verification

Gate Result: ⚠️ SKIPPED

Platform: android
Mode: Full Verification

  • Tests FAIL without fix: N/A
  • Tests PASS with fix: N/A

Reason: PR #32350 does not add or modify test files under TestCases.HostApp, TestCases.Shared.Tests, or other test projects in the diff, so the gate phase is skipped per skill instructions.


🔧 Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 try-fix (claude-opus-4.6) Introduce public IBehavior / IBehavior<T> and public IAttachedObject, but keep VisualElement.Behaviors and its backing collection typed as Behavior instead of widening to IBehavior ✅ PASS src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/PublicAPI/*/PublicAPI.Unshipped.txt Smallest passing fix, but it gives up the PR’s intended IList<IBehavior> public shape
2 try-fix (claude-sonnet-4.6) Add a BehaviorCollection : AttachedCollection<Behavior>, IList<IBehavior> bridge so the public property can be IList<IBehavior> while the concrete collection stays Behavior-compatible for existing reflection/XAML code paths ✅ PASS src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/BehaviorCollection.cs, src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/PublicAPI/*/PublicAPI.Unshipped.txt Preserves the intended public API shape with a compatibility shim
3 try-fix (gpt-5.3-codex) Add a dedicated BehaviorAttachedCollection : ObservableCollection<IBehavior>, IAttachedObject and point VisualElement.Behaviors at it, leaving generic AttachedCollection<T> unchanged ❌ FAIL src/Controls/src/Core/Interactivity/AttachedCollection.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/VisualElement/VisualElement.cs Initial validation blocked by PublicAPI analyzer issues
4 try-fix (gemini-3-pro-preview) Add a dedicated BehaviorCollection : ObservableCollection<IBehavior>, IAttachedObject and move VisualElement.Behaviors to it, isolating behavior semantics from generic AttachedCollection<T> ✅ PASS src/Controls/src/Core/Interactivity/BehaviorCollection.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/PublicAPI/**/*.txt Works, but touches more code than needed
5 try-fix (gpt-5.3-codex, cross-pollination) Use a plain ObservableCollection<IBehavior> backing store and handle attach/detach directly in VisualElement via CollectionChanged ✅ PASS src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs Avoids custom collection types, but shifts more lifecycle logic into VisualElement
6 try-fix (claude-opus-4.6, cross-pollination) Keep the widened IList<IBehavior> API, but fix the XAML reflection path by resolving Add from the concrete runtime collection type in ApplyPropertiesVisitor ✅ PASS src/Controls/src/Xaml/ApplyPropertiesVisitor.cs Best balance: preserves PR intent, fixes regression in one file, and passes GenericsIssue + BehaviorTest
PR PR #32350 Introduce public IBehavior / IBehavior<T>, make IAttachedObject public, and widen VisualElement.Behaviors + backing collection to IBehavior ⚠️ NOT VERIFIED IN GATE src/Controls/src/Core/Interactivity/AttachedCollection.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/Interactivity/IBehavior.cs, src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/PublicAPI/*/PublicAPI.Shipped.txt Review history reported a generic/XAML reflection regression

Cross-Pollination

Model Round New Ideas? Details
claude-opus-4.6 1 Yes Keep the public interface introduction but preserve the concrete Behavior collection type to avoid invariance/reflection issues.
claude-sonnet-4.6 1 Yes Introduce a bridge collection that implements IList<IBehavior> but remains AttachedCollection<Behavior>-compatible for existing XAML reflection paths.
gpt-5.3-codex 1 Yes Add a separate IBehavior-native attached collection instead of widening the generic collection or keeping the old property shape.
gemini-3-pro-preview 1 Yes Replace the backing collection with a dedicated ObservableCollection<IBehavior> implementation specialized for behavior attach/detach semantics.
claude-opus-4.6 2 Yes Keep the widened API and fix the XAML add-path to resolve Add from the concrete runtime collection type.
claude-sonnet-4.6 2 No NO NEW IDEAS beyond the candidate set.
gpt-5.3-codex 2 Yes Use a plain ObservableCollection<IBehavior> and wire attach/detach in VisualElement instead of any attached collection type.
gemini-3-pro-preview 2 No NO NEW IDEAS beyond the candidate set.
claude-opus-4.6 3 No NO NEW IDEAS: remaining differences collapse into XAML/compiler changes or repackage candidate 6.
claude-sonnet-4.6 3 Yes Theoretical collection-boundary metadata/reflection hack, judged higher-risk and less direct than candidate 6.
gpt-5.3-codex 3 No NO NEW IDEAS: practical solution space exhausted.
gemini-3-pro-preview 3 Yes Theoretical BehaviorWrapper adapter idea, judged inferior to existing passing candidates.

Exhausted: Yes (max 3 cross-pollination rounds reached)
Selected Fix: Candidate #6 — preserves the PR’s intended public API while fixing the XAML reflection regression with the smallest validated change.


📋 Report — Final Recommendation

⚠️ Final Recommendation: REQUEST CHANGES

Phase Status

Phase Status Notes
Pre-Flight ✅ COMPLETE PR #32350 is an experimental breaking API change for Controls/XAML behavior APIs with no test files in the diff.
Gate ⚠️ SKIPPED User requested Android, but the PR adds no test changes; the relevant regression surface is existing shared XAML/core tests rather than Android UI tests.
Try-Fix ✅ COMPLETE 6 attempts total, 5 passing candidates, 3 cross-pollination rounds completed.
Report ✅ COMPLETE

Summary

PR #32350 aims to expose IBehavior publicly and widen VisualElement.Behaviors to IList<IBehavior>, but review history already surfaced a regression in the existing GenericsIssue XAML test. The mandatory try-fix phase found multiple passing alternatives, including one especially strong candidate that preserves the PR's intended public API while fixing the regression with a single XAML-layer change.

Because a better validated alternative exists, this PR should not be approved in its current form. The best alternative is Candidate #6 from try-fix/content.md: keep the widened IList<IBehavior> API, but update src/Controls/src/Xaml/ApplyPropertiesVisitor.cs so it resolves Add from the concrete runtime collection type rather than the declared interface type.

Root Cause

The regression comes from generic invariance plus reflection method resolution. After widening the property to IList<IBehavior>, XAML collection-item insertion can end up binding to ICollection<IBehavior>.Add, while the concrete runtime object still follows Behavior-oriented collection semantics. That mismatch is what produces the TargetException reported in review discussion for GenericsIssue.

Fix Quality

The current PR changes the public API and the backing collection shape, but it does not appear to address the XAML reflection compatibility issue directly. In contrast, Candidate #6 fixes the actual failing insertion path in one file, preserves the PR's intended public surface, and was empirically validated against:

  • dotnet test src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj --filter GenericsIssue --no-restore
  • dotnet test src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj --filter BehaviorTest --no-restore

Compared with the other passing candidates, Candidate #6 is the simplest change that still honors the PR's design intent. Candidate #1 is smaller but abandons the intended IList<IBehavior> API. Candidates #2, #4, and #5 work, but they introduce extra collection types or lifecycle wiring that are heavier than necessary.


Deep UI tests — 1023 passed, 27 failed across 11 categories on platform-pool agent (replaces in-process counts above).

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
Border 47/47 ✓
Brush 41/41 ✓
Button 66/68 ✓
CheckBox 23/23 ✓
CollectionView 591/618 (27 ❌) 2 diff PNGs
DatePicker 43/43 ✓
Essentials
FlyoutPage 61/61 ✓
Gestures 56/56 ✓
Image 43/45 ✓
ImageButton 52/52 ✓
CollectionView — 27 failed tests
VerifyGroupIndexScrollToByIndexWithStartPositionAndVerticalList_Carrot
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithStartPositionAndVerticalList_Carrot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1838
   at System.Runtim
...
VerifyGroupIndexScrollToByIndexWithCenterPositionAndVerticalList_Potato
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithCenterPositionAndVerticalList_Potato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1874
   at System.Refle
...
VisitAndUpdateItemsSource("Observable Collection","Add/RemoveItemsGrid",19,6)
The app was expected to be running still, investigate as possible crash
TearDown : The app was expected to be running still, investigate as possible crash
at UITest.Appium.NUnit.UITestBase.UITestBaseTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 159
   at UITest.Appium.NUnit.UITestBase.TestTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 45
   at InvokeStub_UITestBase.TestTearDown(Object, Object, IntPtr*)

--TearDown
   at UITest.Appium.NUnit.UITestBase.UITestBaseTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 159
   at UITest.Appium.NUnit.UITestBase.TestTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 45
   at InvokeStub_UITestBase.TestTearDown(Object, Object, IntPtr*)

1)    at UITest.Appium.NUnit.UITestBase.UITestBaseTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 159
   at UITest.Appium.NUnit.UITestBase.TestTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 45
   at InvokeS
...
VerifyGroupItemScrollToByIndexWithStartPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByIndexWithStartPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3345
   at System.Runtime
...
VerifyGroupItemScrollToByItemWithCenterPositionAndVerticalList_Potato
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByItemWithCenterPositionAndVerticalList_Potato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2007
   at System.Runtime
...
VerifyScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2137
   at System.RuntimeMet
...
VerifyGroupIndexScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2810
   at System.
...
VerifyGroupItemScrollToByItemWithStartPositionAndVerticalList_Carrot
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByItemWithStartPositionAndVerticalList_Carrot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1974
   at System.RuntimeM
...
VerifyScrollToByItemWithCenterPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyScrollToByItemWithCenterPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2628
   at System.RuntimeMethodHan
...
VerifyGroupIndexScrollToByIndexWithMakeVisiblePositionAndVerticalList_Apricot
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithMakeVisiblePositionAndVerticalList_Apricot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1802
   at System
...
VerifyScrollToByItemWithMakeVisiblePositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyScrollToByItemWithMakeVisiblePositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2458
   at System.RuntimeMeth
...
VerifyRemainingItemsThresholdReachedWithHorizontalList
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyRemainingItemsThresholdReachedWithHorizontalList() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3652
   at System.RuntimeMethodHandle.In
...
VerifyGroupIndexScrollToByIndexWithCenterPositionAndHorizontalList_Tomato
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithCenterPositionAndHorizontalList_Tomato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3026
   at System.Ref
...
VerifyGroupItemScrollToByIndexWithEndPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByIndexWithEndPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3561
   at System.RuntimeMe
...
VerifyGroupItemScrollToByItemWithMakeVisiblePositionAndVerticalList_Apricot
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByItemWithMakeVisiblePositionAndVerticalList_Apricot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1943
   at System.R
...
VerifyFlowDirectionRTLAndMeasureAllItemsWithObservableCollection
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyFlowDirectionRTLAndMeasureAllItemsWithObservableCollection() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 77
   at System.Reflection.Met
...
VerifyFlowDirectionLTRWithHeaderTemplateAndFooterTemplateAndHorizontalList
System.TimeoutException : Timed out waiting for element...
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.CollectionView_SelectionFeatureTests.VerifyFlowDirectionLTRWithHeaderTemplateAndFooterTemplateAndHorizontalList() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_SelectionFeatureTests.cs:line 1113
   at System.Ru
...
VerifyScrollToByIndexWithEndPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyScrollToByIndexWithEndPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2376
   at System.RuntimeMethodHandl
...
VerifyScrollToByItemWithStartPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyScrollToByItemWithStartPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2541
   at System.RuntimeMethodHand
...
VerifyGroupIndexScrollToByIndexWithEndPositionAndHorizontalGrid_Potato
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithEndPositionAndHorizontalGrid_Potato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3170
   at System.Reflec
...
VerifyGroupIndexScrollToByIndexWithEndPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithEndPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3134
   at System.RuntimeM
...
VerifyGroupItemScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3241
   at System.R
...
VerifyGroupIndexScrollToByIndexWithStartPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithStartPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2918
   at System.Runtim
...
VerifyScrollToByIndexWithCenterPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyScrollToByIndexWithCenterPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2295
   at System.RuntimeMethodHa
...
VerifyGroupItemScrollToByIndexWithEndPositionAndHorizontalGrid_Potato
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByIndexWithEndPositionAndHorizontalGrid_Potato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3597
   at System.Runtime
...
VerifyScrollToByItemWithEndPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyScrollToByItemWithEndPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2715
   at System.RuntimeMethodHandle
...
VerifyScrollToByIndexWithStartPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
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.CollectionView_ScrollingFeatureTests.VerifyScrollToByIndexWithStartPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2214
   at System.RuntimeMethodHan
...

📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)

@MauiBot MauiBot added s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-fix-win AI found a better alternative fix than the PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels Mar 22, 2026
@kubaflo

kubaflo commented Mar 22, 2026

Copy link
Copy Markdown
Contributor

It should target net11, but do we want it @jfversluis?

@kubaflo

kubaflo commented May 24, 2026

Copy link
Copy Markdown
Contributor

/review -b feature/refactor-copilot-yml

@kubaflo kubaflo changed the base branch from main to net11.0 May 25, 2026 20:50
@kubaflo

kubaflo commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

AI code review for net11.0 target

Automated, non-approval review comment. This does not constitute a human approval and intentionally does not use GitHub's Approve/Request-changes.

Verdict: Needs discussion

What this PR does

Introduces public IBehavior / IBehavior<T> interfaces, promotes IAttachedObject from internal to public, makes Behavior/Behavior<T> implement them, relaxes AttachedCollection<T>'s constraint from BindableObject, IAttachedObject to just IAttachedObject, and changes VisualElement.Behaviors from IList<Behavior> to IList<IBehavior>.

Findings

  • 🔴 Breaking public-API change. VisualElement.Behaviors changes element type (IList<Behavior>IList<IBehavior>) and BehaviorsProperty's value type changes accordingly. This is both source- and binary-breaking, and the diff edits PublicAPI.Shipped.txt (not just Unshipped) across all TFMs — i.e. it mutates already-shipped API. The author explicitly acknowledges this in the description and marks the PR "for continued discussion only / experimental / must not go into a minor or service release." Agreed — this needs API-council/design review and a major-version landing.
  • 🟠 "Experimental" is only in the title. The new IBehavior/IBehavior<T>/IAttachedObject types are plain public with no [Experimental(...)] attribute. If the intent is experimental opt-in, the types should carry the analyzer attribute so consumers must acknowledge instability; otherwise it ships as stable API.
  • 🟠 Promoting IAttachedObject to public exposes AttachTo/DetachFrom as a public contract — previously internal implementation detail. Worth confirming this is the intended long-term surface (naming, XML docs, discoverability) before committing.
  • 🟡 The PR body header still contains the boilerplate "MAIN IS THE ONLY ACTIVE BRANCH — make sure this PR is targeting MAIN," yet it targets net11.0. Confirm the intended target branch.
  • ✅ Mechanically the change is consistent (collection type, bindable property default, doc comments updated together).

No blocking correctness defects in the implementation itself — the concern is API design/compat, which is exactly what the author flagged for discussion.

CI note

Only license/cla has reported; the maui-pr pipeline has not run, so there is no build/test signal yet. A full run (and the public-API analyzer in particular) should be green before any merge decision.

Confidence: High that this is a deliberate breaking/experimental change requiring design sign-off rather than a code-quality issue.

@kubaflo kubaflo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

PR #32350 — Experimental interface IBehavior

Verdict: NEEDS_DISCUSSION (confidence: high)

This is an author-acknowledged, explicitly experimental ("for continued discussion only") breaking public-API change — VisualElement.Behaviors goes from IList<Behavior> to IList<IBehavior> and IAttachedObject is promoted internal→public. It needs API-council/design sign-off and correctly targets the net11.0 major branch, so the central question is a design decision, not a fixable code defect.

Why the models split (2 ND / 2 NC): The two NC votes rest on weaker grounds when checked against the code. Gemini's NC asks to "revert the breaking change / defer to a major release" — but the breaking change is intentional, acknowledged, and already targeted at net11.0 (a major release), so its objection restates the PR's own premise. opus46's NC is a real but latent issue (see below). The two ND votes (gpt-5.5, opus-4.8) align with the PR's disclaimer and the prior copilot-cli-net11-fleet-review, which already landed on "Needs discussion."

Key findings (validated against HEAD af3d837)

  • [inline · warning] net-tizen PublicAPI.Shipped.txt is incomplete (from opus-4.6). Confirmed: net-tizen only rewrites the Behaviors.get line (HEAD line 1597) to reference IBehavior but omits the 5 declarations added to all 6 other TFMs (IAttachedObject, IBehavior, ~IBehavior<T>, AttachTo, DetachFrom). RS0016 would fire — but latent: Tizen is disabled in CI (IncludeTizenTargetFrameworks=false in Directory.Build.props), so it does not break the current build; it breaks once Tizen re-enables. Novel — "tizen" appears 0 times in the discussion. This is fix-before-merge, not disposition-changing.
  • New API written to Shipped.txt, not Unshipped.txt (from opus-4.8). Valid per public-api.instructions.md (new public surface belongs in PublicAPI.Unshipped.txt; no Unshipped file is touched). Not inlined — already raised by the prior net11 fleet review ("edits PublicAPI.Shipped.txt (not just Unshipped) across all TFMs").
  • Breaking IList<Behavior>IList<IBehavior> (gemini, gpt-5.5, opus-4.8). Real and invariant-breaking, but intentional/acknowledged and correctly on net11.0. Design-review item, not an inline code defect; already covered in discussion.
  • Design notes for discussion (not inlined): public IBehavior forces the AttachTo/DetachFrom lifecycle into the public contract (opus-4.8); the new types are plain public with no [Experimental] attribute (already raised in discussion); and GenericsIssue reflection cast (AttachedCollection<IBehavior> vs AttachedCollection<Behavior>) was reported failing by jsuarezruiz — the HEAD commit claims to address it, but no test results are available to confirm.

CI

Only license/cla has reported (pass). No build/unit/device/UI results available — merge-readiness and the GenericsIssue fix cannot be confirmed from CI; resolve via the design discussion and a full pipeline run.

~Microsoft.Maui.Controls.VisualElement.BackgroundColor.get -> Microsoft.Maui.Graphics.Color
~Microsoft.Maui.Controls.VisualElement.BackgroundColor.set -> void
~Microsoft.Maui.Controls.VisualElement.Behaviors.get -> System.Collections.Generic.IList<Microsoft.Maui.Controls.Behavior>
~Microsoft.Maui.Controls.VisualElement.Behaviors.get -> System.Collections.Generic.IList<Microsoft.Maui.Controls.IBehavior>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

net-tizen only updates VisualElement.Behaviors.get to reference IBehavior but omits the five declarations added to every other TFM: the IAttachedObject and IBehavior types, ~IBehavior<T>, and the ~IAttachedObject.AttachTo/DetachFrom members. IBehavior is now referenced here without being declared, so RS0016 would fire when the Tizen surface is analyzed. This won't break the current PR build (Tizen is disabled in CI via IncludeTizenTargetFrameworks=false in Directory.Build.props), but it leaves net-tizen inconsistent with the other six TFMs and will fail once Tizen is re-enabled. Add the missing entries to match net-android/net-ios/etc.:

Microsoft.Maui.Controls.IAttachedObject
Microsoft.Maui.Controls.IBehavior
~Microsoft.Maui.Controls.IAttachedObject.AttachTo(Microsoft.Maui.Controls.BindableObject bindable) -> void
~Microsoft.Maui.Controls.IAttachedObject.DetachFrom(Microsoft.Maui.Controls.BindableObject bindable) -> void
~Microsoft.Maui.Controls.IBehavior<T>

@kubaflo kubaflo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could you please check the ai's suggestions?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-xaml XAML, CSS, Triggers, Behaviors community ✨ Community Contribution s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-fix-win AI found a better alternative fix than the PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants