Skip to content

Fix StrokeDashArray on Border does not reset when set to null #29910

Open
devanathan-vaithiyanathan wants to merge 10 commits intodotnet:mainfrom
devanathan-vaithiyanathan:fix-29898
Open

Fix StrokeDashArray on Border does not reset when set to null #29910
devanathan-vaithiyanathan wants to merge 10 commits intodotnet:mainfrom
devanathan-vaithiyanathan:fix-29898

Conversation

@devanathan-vaithiyanathan
Copy link
Copy Markdown
Contributor

@devanathan-vaithiyanathan devanathan-vaithiyanathan commented Jun 10, 2025

Note

Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!

Issue Details:

Setting Border.StrokeDashArray to null does not remove the previously applied dash pattern, causing the dashed border to remain visible.

Description of Change

Handled the case where StrokeDashArray is set to null by resetting the native dash pattern to ensure the stroke renders as a solid line.

Issues Fixed

Fixes #29898
Fixes #22326

Tested the behavior in the following platforms.

  • Android
  • Windows
  • iOS
  • Mac
Before After
iOS
iOS-BeforeFix.mov
iOS
iOS-AfterFix.mov

@dotnet-policy-service dotnet-policy-service bot added the community ✨ Community Contribution label Jun 10, 2025
@dotnet-policy-service
Copy link
Copy Markdown
Contributor

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

@dotnet-policy-service dotnet-policy-service bot added the partner/syncfusion Issues / PR's with Syncfusion collaboration label Jun 10, 2025
@jsuarezruiz
Copy link
Copy Markdown
Contributor

/azp run MAUI-UITests-public

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

@devanathan-vaithiyanathan devanathan-vaithiyanathan changed the title [iOS, macOS] Fix StrokeDashArray on Border does not reset when set to null Fix StrokeDashArray on Border does not reset when set to null Jun 11, 2025
@devanathan-vaithiyanathan devanathan-vaithiyanathan marked this pull request as ready for review June 11, 2025 11:45
Copilot AI review requested due to automatic review settings June 11, 2025 11:45
@devanathan-vaithiyanathan devanathan-vaithiyanathan requested a review from a team as a code owner June 11, 2025 11:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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 fixes an issue where setting Border.StrokeDashArray to null (or an empty array) did not clear the previously applied dash pattern on iOS and macOS Catalyst. It adds matching logic on Windows and Android platforms and includes a new UI sample and automated tests to verify the behavior.

  • Handle null/empty dash arrays in the iOS MauiCALayer implementation
  • Mirror the “clear dash” logic in Windows and Android renderers
  • Add a sample page and UI tests to confirm both clearing and setting dash patterns

Reviewed Changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/Core/src/Platform/iOS/MauiCALayer.cs Reset _strokeDash to null when dash array is null or empty
src/Core/src/Platform/Windows/StrokeExtensions.cs Remove early return so null dash arrays propagate to UpdateStrokeDashPattern
src/Core/src/Platform/Windows/BorderExtensions.cs Clear StrokeDashArray on null/empty dash arrays
src/Core/src/Graphics/MauiDrawable.Android.cs Reset _borderPathEffect and clear paint path effect on null/empty
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29898.cs Add UI tests for “Clear” and “Set” dash buttons
src/Controls/tests/TestCases.HostApp/Issues/Issue29898.cs Add sample page with Clear/Set buttons for manual testing
Comments suppressed due to low confidence (2)

src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29898.cs:21

  • Consider adding a third test that sets StrokeDashArray to an empty collection (new DoubleCollection()) to verify that the empty-array branch also correctly clears the dash pattern.
VerifyScreenshot();

src/Controls/tests/TestCases.HostApp/Issues/Issue29898.cs:19

  • [nitpick] The local variables button and button2 are ambiguous; consider renaming them to clearDashButton and setDashButton for better readability.
var button = new Button

}
else if (borderDashArray is null || borderDashArray.Length == 0)
{
borderPath.StrokeDashArray = null;
Copy link

Copilot AI Jun 11, 2025

Choose a reason for hiding this comment

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

Assigning StrokeDashArray to null may lead to NullReferenceExceptions when the path renders. It’s safer to call borderPath.StrokeDashArray.Clear() to preserve a valid collection object.

Suggested change
borderPath.StrokeDashArray = null;
if (borderPath.StrokeDashArray == null)
borderPath.StrokeDashArray = new WDoubleCollection();
borderPath.StrokeDashArray.Clear();

Copilot uses AI. Check for mistakes.
_borderPathEffect = null;
if (_borderPaint != null)
{
_borderPaint.SetPathEffect(null);
Copy link

Copilot AI Jun 11, 2025

Choose a reason for hiding this comment

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

After clearing the path effect on the paint, call InvalidateSelf() (or the equivalent) on the drawable to ensure the UI is redrawn immediately.

Suggested change
_borderPaint.SetPathEffect(null);
_borderPaint.SetPathEffect(null);
InvalidateSelf();

Copilot uses AI. Check for mistakes.
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.

InvalidateSelf(); is invoked in line 311

@jsuarezruiz
Copy link
Copy Markdown
Contributor

/azp run MAUI-UITests-public

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

{
App.WaitForElement("SetDashButton");
App.Tap("SetDashButton");
VerifyScreenshot();
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.

Pending snapshots. Running a build.

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.

Snapshots available in the latest build.
image

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@jsuarezruiz , I have added the pending snapshot.

@jsuarezruiz
Copy link
Copy Markdown
Contributor

/azp run MAUI-UITests-public

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Dec 9, 2025

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 29910

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 29910"

@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented Mar 21, 2026

⚠️ Merge Conflict Detected — This PR has merge conflicts with its target branch. Please rebase onto the target branch and resolve the conflicts.

Copy link
Copy Markdown
Contributor

@kubaflo kubaflo left a comment

Choose a reason for hiding this comment

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

Could you please resolve conflicts?

@devanathan-vaithiyanathan
Copy link
Copy Markdown
Contributor Author

Could you please resolve conflicts?

@kubaflo , I have resolved the conflicts

@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented Mar 24, 2026

🤖 AI Summary

📊 Expand Full Reviewd676d0f · iOS 26 image added
🔍 Pre-Flight — Context & Validation

Issue: #29898 - StrokeDashArray on Border does not reset when set to null
Related Issue: #22326 - StrokeDashArray of a Border control is not well recycled with a CollectionView
PR: #29910 - Fix StrokeDashArray on Border does not reset when set to null
Author: devanathan-vaithiyanathan (partner/syncfusion)
Platforms Affected: iOS, macOS, Android, Windows (all reported in issues)
Files Changed: 3 implementation (iOS: MauiCALayer.cs, Windows: BorderExtensions.cs, StrokeExtensions.cs), 2 UI test source files, 10 snapshot PNGs

Key Findings

  • Bug: When Border.StrokeDashArray is initially set to a dash pattern (e.g., {10, 5}) and then set to null, the dash pattern remains visually applied on all platforms.
  • iOS/macOS root cause: MauiCALayer.SetBorderDash had no else branch — when borderDashArray is null/empty, _strokeDash was never cleared. Only assigned when array is non-null and non-empty.
  • Windows root cause: StrokeExtensions.UpdateStrokeDashPattern had an early return if (strokeDashPattern == null) return; preventing null from reaching BorderExtensions.UpdateStrokeDashPattern. Additionally, BorderExtensions.UpdateStrokeDashPattern lacked a null/empty reset branch.
  • Android: MauiDrawable.Android.cs SetBorderDash sets BorderPathEffect = null when strokeDashArray is null/empty — code appears correct, no fix added in this PR. Gate failure on Android is likely a snapshot mismatch (snapshots captured on different device/resolution than gate runner).
  • Unresolved Copilot reviewer concern: On Windows, setting borderPath.StrokeDashArray = null may cause NullReferenceExceptions during rendering — suggested Clear() instead. Thread still unresolved.
  • Pre-existing Windows bug (not introduced by this PR): BorderExtensions Add()s to existing collection without clearing first — setting from {10,5} to {5,2} would accumulate to {10,5,5,2}.
  • Test page [Issue] attribute uses PlatformAffected.iOS despite bug affecting all platforms.
  • Both new test files missing newline at end of file.
  • VerifyScreenshot() lacks retryTimeout — potential flakiness if platform rendering isn't immediate after tap.
  • Related issue StrokeDashArray of a Border control is not well recycled with a CollectionView #22326 (CollectionView recycling) may still not be fully addressed since the PR doesn't add a test specifically for the recycling scenario.

Edge Cases / Discussion Notes

  • Empty DoubleCollection (not just null) should also reset — the PR handles this too via is null || .Length == 0.
  • The else if in the PR is logically equivalent to else since the first branch already handles non-null/non-empty. Using else would be cleaner.
  • Issue StrokeDashArray on Border does not reset when set to null #29898 affects all platforms per issue report, but the PR title says "[iOS, macOS]" and PlatformAffected.iOS was used in HostApp.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #29910 else if (null || empty) { _strokeDash = null; } in MauiCALayer; null borderPath.StrokeDashArray on Windows; remove Windows early return ❌ FAILED (Gate) MauiCALayer.cs, BorderExtensions.cs, StrokeExtensions.cs Gate failure likely Android snapshot mismatch; logic is sound; else if is redundant vs else; Windows null assignment has reviewer concern

🔧 Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 Attempt 1 (claude-opus-4.6) Reset-first: _strokeDash = null; before if in MauiCALayer; fresh collection in BorderExtensions; remove Windows early return ⚠️ BLOCKED (snapshot mismatch 11%/9.5%) MauiCALayer.cs, BorderExtensions.cs, StrokeExtensions.cs Correct logic; blocked by Android snapshot mismatch
2 Attempt 2 (claude-sonnet-4.6) Regenerate Android snapshots from gate env; PlatformAffected.All; retryTimeout — no production code change ✅ PASS (2/2) Android snapshots (2), Issue29898.cs (HostApp+Tests) Test-only fix; doesn't correct iOS/Win production bugs
3 Attempt 3 (gpt-5.3-codex) Single-assignment iOS + clear-first Windows + snapshot regen + retryTimeout ✅ PASS (2/2) MauiCALayer.cs, BorderExtensions.cs, StrokeExtensions.cs, snapshots, Issue29898.cs (both) Full combined fix
4 Attempt 4 (gpt-5.4) iOS else (not else if) + Windows Clear()-based reset (Copilot reviewer suggestion) + remove early return + PlatformAffected.All + retryTimeout + snapshot regen ✅ PASS (2/2) Same as Attempt 3 Cleanest fix; addresses unresolved Copilot reviewer thread; avoids null assignment on Windows
5 Attempt 5 (gpt-5.4 cross-pollination) Normalize at Border.StrokeDashPattern shared getter — return null for empty collection; fix collection subscription; keep platform fixes ✅ PASS (2/2) Border.cs + same as Attempt 4 More invasive (touches shared layer); interesting for issue #22326 but broader impact
PR PR #29910 else if (null || empty) { _strokeDash = null; } in MauiCALayer; null StrokeDashArray in BorderExtensions; remove null early return ❌ FAILED (Gate) MauiCALayer.cs, BorderExtensions.cs, StrokeExtensions.cs Gate failure was snapshot mismatch; else if redundant vs else; Windows null assign has unresolved reviewer concern; missing test improvements

Cross-Pollination

Model Round New Ideas? Details
claude-opus-4.6 2 No "NO NEW IDEAS — all viable approaches covered; gate failure is snapshot environment issue"
claude-sonnet-4.6 2 No "NO NEW IDEAS — Attempt 4 (else + Clear()) is functionally equivalent to and cleaner than PR"
gpt-5.3-codex 2 No "NO NEW IDEAS"
gpt-5.4 2 Yes NEW IDEA: Normalize at shared Border.StrokeDashPattern getter → ran as Attempt 5 → ✅ PASS
gpt-5.4 3 No "NO NEW IDEAS"

Exhausted: Yes — all 4 models have said NO NEW IDEAS in final round
Selected Fix: Attempt 4 (gpt-5.4) — iOS else + Windows Clear()-based reset + PlatformAffected.All + retryTimeout + snapshot regen

Reason: Attempt 4 is the best balance of:

  1. ✅ Fixes actual iOS and Windows production bugs (not just test workaround like Attempt 2)
  2. ✅ Uses else instead of else if — cleaner and less redundant
  3. ✅ Uses Clear() for Windows — directly addresses the unresolved Copilot reviewer thread; safer than = null
  4. ✅ Fixes test quality issues (PlatformAffected.All + retryTimeout + proper snapshots)
  5. ✅ Fewer files than Attempt 5 (no shared layer changes that could have broader impact)

📋 Report — Final Recommendation

⚠️ Final Recommendation: REQUEST CHANGES

Phase Status

Phase Status Notes
Pre-Flight ✅ COMPLETE 3 impl files, 2 test files, 10 snapshots; iOS+Windows bugs identified
Gate ❌ FAILED Android platform — snapshot mismatch, not a logic error in the fix
Try-Fix ✅ COMPLETE 5 attempts, 4 passing (Attempts 2–5); cross-pollination exhausted
Report ✅ COMPLETE

Summary

PR #29910 fixes a real bug: Border.StrokeDashArray = null does not reset the dash pattern on iOS/macOS and Windows. The fix logic is correct but the PR has several quality issues that should be addressed before merge:

  1. Gate failure caused by Android snapshot mismatch — snapshots were captured in the PR author's local environment, not the CI gate environment. Android's production code (MauiDrawable.Android.cs) already handles null correctly and needs no fix.
  2. Windows null assignment (borderPath.StrokeDashArray = null) has an unresolved Copilot reviewer concern — nulling the collection may cause NullReferenceException during rendering. The safe pattern is Clear() with null guard.
  3. else if is redundant — since the outer if handles non-null && non-empty, the only remaining case IS null || empty; using plain else is cleaner and logically equivalent.
  4. Test quality issues: PlatformAffected.iOS should be PlatformAffected.All (bug affects all platforms); VerifyScreenshot() needs retryTimeout for stability; both test files missing newline at EOF.
  5. Pre-existing Windows accumulation bug not introduced by this PR: BorderExtensions Add()s to an existing collection without clearing first — setting dash from {10,5} to {5,2} accumulates to {10,5,5,2}.

Root Cause

Platform Root Cause
iOS/macOS MauiCALayer.SetBorderDash: _strokeDash is only assigned in the if (non-null && non-empty) branch. When null is passed, _strokeDash retains its old value and the dash is still drawn.
Windows StrokeExtensions.UpdateStrokeDashPattern had an early return if (strokeDashPattern == null) return; blocking null from reaching BorderExtensions. BorderExtensions.UpdateStrokeDashPattern had no null/empty reset branch, and doesn't clear before adding.
Android Already handled correctly — SetBorderDash sets BorderPathEffect = null when array is null. Gate failure was snapshot environment mismatch only.

Fix Quality

PR's fix is logically sound on iOS/Windows but has the issues listed above.

Better fix (Attempt 4) found by Try-Fix — passes tests, cleaner, addresses all reviewer concerns:

Change PR Approach Better Approach (Attempt 4)
iOS MauiCALayer else if (null || empty) { _strokeDash = null; } else { _strokeDash = null; } — cleaner, non-redundant
Windows BorderExtensions else if (...) { borderPath.StrokeDashArray = null; } else { if (borderPath.StrokeDashArray == null) ... else borderPath.StrokeDashArray.Clear(); } — safe per Copilot reviewer; also clears before Add() to fix accumulation bug
Windows StrokeExtensions Remove null early return Same
Android snapshots Wrong env (local) Regenerated from gate environment
PlatformAffected .iOS (incorrect) .All (correct)
VerifyScreenshot() No retry retryTimeout: TimeSpan.FromSeconds(2)
Newline at EOF Missing Added

Selected Fix: Attempt 4 (gpt-5.4) — not PR's fix

Requested Changes

  1. iOS MauiCALayer.cs: Change else if (borderDashArray is null || borderDashArray.Length == 0) to plain else
  2. Windows BorderExtensions.cs: Replace borderPath.StrokeDashArray = null with the Clear()-based pattern (Copilot reviewer suggestion); also clear collection before Add() to fix accumulation bug
  3. Android snapshots: Regenerate from CI/gate environment (not local dev machine)
  4. Issue29898.cs (HostApp): Change PlatformAffected.iOSPlatformAffected.All; add newline at EOF
  5. Issue29898.cs (Tests): Add retryTimeout: TimeSpan.FromSeconds(2) to both VerifyScreenshot() calls; add newline at EOF

@MauiBot MauiBot added s/agent-review-incomplete AI agent could not complete all phases (blocker, timeout, error) 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 24, 2026
Copy link
Copy Markdown
Contributor

@kubaflo kubaflo left a comment

Choose a reason for hiding this comment

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

Could you please add iOS 26 screenshots?

@devanathan-vaithiyanathan
Copy link
Copy Markdown
Contributor Author

Could you please add iOS 26 screenshots?

@kubaflo , I have included the iOS 26 screenshots

@MauiBot
Copy link
Copy Markdown
Collaborator

MauiBot commented Mar 27, 2026

🚦 Gate - Test Before and After Fix

📊 Expand Full Gated676d0f · iOS 26 image added

Gate Result: ❌ FAILED

Platform: ANDROID · Base: main · Merge base: 720a9d4a

Test Without Fix (expect FAIL) With Fix (expect PASS)
🖥️ Issue29898 Issue29898 ✅ FAIL — 823s ❌ FAIL — 1250s
🔴 Without fix — 🖥️ Issue29898: FAIL ✅ · 823s
  Determining projects to restore...
  Restored /home/vsts/work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 738 ms).
  Restored /home/vsts/work/1/s/src/Essentials/src/Essentials.csproj (in 4.58 sec).
  Restored /home/vsts/work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 8.17 sec).
  Restored /home/vsts/work/1/s/src/Core/src/Core.csproj (in 2.71 sec).
  Restored /home/vsts/work/1/s/src/Core/maps/src/Maps.csproj (in 1.26 sec).
  Restored /home/vsts/work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 34 ms).
  Restored /home/vsts/work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 29 ms).
  Restored /home/vsts/work/1/s/src/Controls/Foldable/src/Controls.Foldable.csproj (in 54 ms).
  Restored /home/vsts/work/1/s/src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj (in 1.33 sec).
  Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj (in 2.86 sec).
  1 of 11 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
  Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:08:54.96
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
  Determining projects to restore...
  Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils/VisualTestUtils.csproj (in 1.32 sec).
  Restored /home/vsts/work/1/s/src/TestUtils/src/VisualTestUtils.MagickNet/VisualTestUtils.MagickNet.csproj (in 7.27 sec).
  Restored /home/vsts/work/1/s/src/Controls/tests/TestCases.Android.Tests/Controls.TestCases.Android.Tests.csproj (in 8.95 sec).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Core/UITest.Core.csproj (in 6 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Appium/UITest.Appium.csproj (in 3 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.NUnit/UITest.NUnit.csproj (in 802 ms).
  Restored /home/vsts/work/1/s/src/Controls/tests/CustomAttributes/Controls.CustomAttributes.csproj (in 12 ms).
  Restored /home/vsts/work/1/s/src/TestUtils/src/UITest.Analyzers/UITest.Analyzers.csproj (in 3.05 sec).
  5 of 13 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.20]   Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.71]   Discovered:  Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
   NUnit3TestExecutor discovered 2 of 2 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 03/29/2026 19:41:59 FixtureSetup for Issue29898(Android)
>>>>> 03/29/2026 19:42:03 VerifyBorderWithNullStrokeDashArray Start
>>>>> 03/29/2026 19:42:10 VerifyBorderWithNullStrokeDashArray Stop
>>>>> 03/29/2026 19:42:11 Log types: logcat, bugreport, server
  Failed VerifyBorderWithNullStrokeDashArray [9 s]
  Error Message:
   VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyBorderWithNullStrokeDashArray.png (11.03% difference)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow

  Stack Trace:
     at VisualTestUtils.VisualRegressionTester.Fail(String message) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 162
   at VisualTestUtils.VisualRegressionTester.VerifyMatchesSnapshot(String name, ImageSnapshot actualImage, String environmentName, ITestContext testContext) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 123
   at Microsoft.Maui.TestCases.Tests.UITest.<VerifyScreenshot>g__Verify|13_0(String name, <>c__DisplayClass13_0&) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 477
   at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 309
   at Microsoft.Maui.TestCases.Tests.Issues.Issue29898.VerifyBorderWithNullStrokeDashArray() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29898.cs:line 21
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)

>>>>> 03/29/2026 19:42:12 VerifyBorderWithStrokeDashArrayValue Start
>>>>> 03/29/2026 19:42:17 VerifyBorderWithStrokeDashArrayValue Stop
>>>>> 03/29/2026 19:42:17 Log types: logcat, bugreport, server
  Failed VerifyBorderWithStrokeDashArrayValue [6 s]
  Error Message:
   VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyBorderWithStrokeDashArrayValue.png (9.55% difference)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow

  Stack Trace:
     at VisualTestUtils.VisualRegressionTester.Fail(String message) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 162
   at VisualTestUtils.VisualRegressionTester.VerifyMatchesSnapshot(String name, ImageSnapshot actualImage, String environmentName, ITestContext testContext) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 123
   at Microsoft.Maui.TestCases.Tests.UITest.<VerifyScreenshot>g__Verify|13_0(String name, <>c__DisplayClass13_0&) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 477
   at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 309
   at Microsoft.Maui.TestCases.Tests.Issues.Issue29898.VerifyBorderWithStrokeDashArrayValue() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29898.cs:line 30
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)

NUnit Adapter 4.5.0.0: Test execution complete

Total tests: 2
     Failed: 2
Test Run Failed.
 Total time: 1.3710 Minutes

🟢 With fix — 🖥️ Issue29898: FAIL ❌ · 1250s

(truncated to last 15,000 chars)

k/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Mono.AndroidTools.AndroidDevice.<>c__DisplayClass105_0.<InstallPackage>b__0(Task`1 t) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010: --- End of stack trace from previous location --- [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at AndroidDeviceExtensions.PushAndInstallPackageAsync(AndroidDevice device, PushAndInstallCommand command, CancellationToken token) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.InstallPackage(Boolean installed) [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
/home/vsts/work/1/s/.dotnet/packs/Microsoft.Android.Sdk.Linux/36.1.2/tools/Xamarin.Android.Common.Debugging.targets(333,5): error ADB0010:    at Xamarin.Android.Tasks.FastDeploy.RunInstall() [/home/vsts/work/1/s/src/Controls/tests/TestCases.HostApp/Controls.TestCases.HostApp.csproj::TargetFramework=net10.0-android]
    0 Warning(s)
    1 Error(s)

Time Elapsed 00:09:50.08
* daemon not running; starting now at tcp:5037
* daemon started successfully
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0-android36.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0-android36.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0-android36.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net10.0-android36.0/Microsoft.Maui.Maps.dll
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0-android36.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.Foldable/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Foldable.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Xaml.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Microsoft.AspNetCore.Components.WebView.Maui/Debug/net10.0-android36.0/Microsoft.AspNetCore.Components.WebView.Maui.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0-android36.0/Microsoft.Maui.Controls.Maps.dll
  Controls.TestCases.HostApp -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Controls.TestCases.HostApp.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Foldable -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Foldable.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Maps.dll
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.Maui.Controls.Xaml.dll
  Microsoft.AspNetCore.Components.WebView.Maui -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.HostApp/Debug/net10.0-android/Microsoft.AspNetCore.Components.WebView.Maui.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:08:30.74
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
Broadcasting: Intent { act=android.intent.action.CLOSE_SYSTEM_DIALOGS flg=0x400000 }
Broadcast completed: result=0
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.CustomAttributes -> /home/vsts/work/1/s/artifacts/bin/Controls.CustomAttributes/Debug/net10.0/Controls.CustomAttributes.dll
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.60-ci+azdo.13684002
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  UITest.Core -> /home/vsts/work/1/s/artifacts/bin/UITest.Core/Debug/net10.0/UITest.Core.dll
  UITest.Appium -> /home/vsts/work/1/s/artifacts/bin/UITest.Appium/Debug/net10.0/UITest.Appium.dll
  UITest.NUnit -> /home/vsts/work/1/s/artifacts/bin/UITest.NUnit/Debug/net10.0/UITest.NUnit.dll
  VisualTestUtils -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils/Debug/netstandard2.0/VisualTestUtils.dll
  VisualTestUtils.MagickNet -> /home/vsts/work/1/s/artifacts/bin/VisualTestUtils.MagickNet/Debug/netstandard2.0/VisualTestUtils.MagickNet.dll
  UITest.Analyzers -> /home/vsts/work/1/s/artifacts/bin/UITest.Analyzers/Debug/netstandard2.0/UITest.Analyzers.dll
  Controls.TestCases.Android.Tests -> /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
/home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.12]   Discovering: Controls.TestCases.Android.Tests
[xUnit.net 00:00:00.39]   Discovered:  Controls.TestCases.Android.Tests
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in /home/vsts/work/1/s/artifacts/bin/Controls.TestCases.Android.Tests/Debug/net10.0/Controls.TestCases.Android.Tests.dll
   NUnit3TestExecutor discovered 2 of 2 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 03/29/2026 20:02:53 FixtureSetup for Issue29898(Android)
>>>>> 03/29/2026 20:02:55 VerifyBorderWithNullStrokeDashArray Start
>>>>> 03/29/2026 20:03:02 VerifyBorderWithNullStrokeDashArray Stop
>>>>> 03/29/2026 20:03:02 Log types: logcat, bugreport, server
  Failed VerifyBorderWithNullStrokeDashArray [7 s]
  Error Message:
   VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyBorderWithNullStrokeDashArray.png (11.03% difference)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow

  Stack Trace:
     at VisualTestUtils.VisualRegressionTester.Fail(String message) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 162
   at VisualTestUtils.VisualRegressionTester.VerifyMatchesSnapshot(String name, ImageSnapshot actualImage, String environmentName, ITestContext testContext) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 123
   at Microsoft.Maui.TestCases.Tests.UITest.<VerifyScreenshot>g__Verify|13_0(String name, <>c__DisplayClass13_0&) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 477
   at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 309
   at Microsoft.Maui.TestCases.Tests.Issues.Issue29898.VerifyBorderWithNullStrokeDashArray() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29898.cs:line 21
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)

>>>>> 03/29/2026 20:03:03 VerifyBorderWithStrokeDashArrayValue Start
>>>>> 03/29/2026 20:03:06 VerifyBorderWithStrokeDashArrayValue Stop
>>>>> 03/29/2026 20:03:06 Log types: logcat, bugreport, server
  Failed VerifyBorderWithStrokeDashArrayValue [4 s]
  Error Message:
   VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyBorderWithStrokeDashArrayValue.png (9.55% difference)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow

  Stack Trace:
     at VisualTestUtils.VisualRegressionTester.Fail(String message) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 162
   at VisualTestUtils.VisualRegressionTester.VerifyMatchesSnapshot(String name, ImageSnapshot actualImage, String environmentName, ITestContext testContext) in /_/src/TestUtils/src/VisualTestUtils/VisualRegressionTester.cs:line 123
   at Microsoft.Maui.TestCases.Tests.UITest.<VerifyScreenshot>g__Verify|13_0(String name, <>c__DisplayClass13_0&) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 477
   at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 309
   at Microsoft.Maui.TestCases.Tests.Issues.Issue29898.VerifyBorderWithStrokeDashArrayValue() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29898.cs:line 30
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)

NUnit Adapter 4.5.0.0: Test execution complete

Test Run Failed.
Total tests: 2
     Failed: 2
 Total time: 30.7336 Seconds

⚠️ Issues found
  • Issue29898 FAILED with fix (should pass)
📁 Fix files reverted (4 files)
  • eng/pipelines/ci-copilot.yml
  • src/Core/src/Platform/Windows/BorderExtensions.cs
  • src/Core/src/Platform/Windows/StrokeExtensions.cs
  • src/Core/src/Platform/iOS/MauiCALayer.cs

@MauiBot MauiBot added s/agent-changes-requested AI agent recommends changes - found a better alternative or issues and removed s/agent-review-incomplete AI agent could not complete all phases (blocker, timeout, error) labels Mar 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-controls-border Border community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration platform/android platform/ios platform/windows 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.

StrokeDashArray on Border does not reset when set to null StrokeDashArray of a Border control is not well recycled with a CollectionView

7 participants