Fix StrokeDashArray on Border does not reset when set to null #29910
Fix StrokeDashArray on Border does not reset when set to null #29910devanathan-vaithiyanathan wants to merge 10 commits intodotnet:mainfrom
Conversation
|
Hey there @@devanathan-vaithiyanathan! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
|
/azp run MAUI-UITests-public |
|
Azure Pipelines successfully started running 1 pipeline(s). |
There was a problem hiding this comment.
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
MauiCALayerimplementation - 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
StrokeDashArrayto 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
buttonandbutton2are ambiguous; consider renaming them toclearDashButtonandsetDashButtonfor better readability.
var button = new Button
| } | ||
| else if (borderDashArray is null || borderDashArray.Length == 0) | ||
| { | ||
| borderPath.StrokeDashArray = null; |
There was a problem hiding this comment.
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.
| borderPath.StrokeDashArray = null; | |
| if (borderPath.StrokeDashArray == null) | |
| borderPath.StrokeDashArray = new WDoubleCollection(); | |
| borderPath.StrokeDashArray.Clear(); |
| _borderPathEffect = null; | ||
| if (_borderPaint != null) | ||
| { | ||
| _borderPaint.SetPathEffect(null); |
There was a problem hiding this comment.
After clearing the path effect on the paint, call InvalidateSelf() (or the equivalent) on the drawable to ensure the UI is redrawn immediately.
| _borderPaint.SetPathEffect(null); | |
| _borderPaint.SetPathEffect(null); | |
| InvalidateSelf(); |
There was a problem hiding this comment.
InvalidateSelf(); is invoked in line 311
|
/azp run MAUI-UITests-public |
|
Azure Pipelines successfully started running 1 pipeline(s). |
| { | ||
| App.WaitForElement("SetDashButton"); | ||
| App.Tap("SetDashButton"); | ||
| VerifyScreenshot(); |
There was a problem hiding this comment.
Pending snapshots. Running a build.
There was a problem hiding this comment.
@jsuarezruiz , I have added the pending snapshot.
|
/azp run MAUI-UITests-public |
|
Azure Pipelines successfully started running 1 pipeline(s). |
c47278b to
0b43994
Compare
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 29910Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 29910" |
|
|
kubaflo
left a comment
There was a problem hiding this comment.
Could you please resolve conflicts?
0b43994 to
74c379b
Compare
@kubaflo , I have resolved the conflicts |
🤖 AI Summary📊 Expand Full Review —
|
| # | 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 |
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:
- ✅ Fixes actual iOS and Windows production bugs (not just test workaround like Attempt 2)
- ✅ Uses
elseinstead ofelse if— cleaner and less redundant - ✅ Uses
Clear()for Windows — directly addresses the unresolved Copilot reviewer thread; safer than= null - ✅ Fixes test quality issues (
PlatformAffected.All+retryTimeout+ proper snapshots) - ✅ 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:
- 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. - Windows null assignment (
borderPath.StrokeDashArray = null) has an unresolved Copilot reviewer concern — nulling the collection may causeNullReferenceExceptionduring rendering. The safe pattern isClear()with null guard. else ifis redundant — since the outerifhandlesnon-null && non-empty, the only remaining case ISnull || empty; using plainelseis cleaner and logically equivalent.- Test quality issues:
PlatformAffected.iOSshould bePlatformAffected.All(bug affects all platforms);VerifyScreenshot()needsretryTimeoutfor stability; both test files missing newline at EOF. - Pre-existing Windows accumulation bug not introduced by this PR:
BorderExtensionsAdd()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
- iOS
MauiCALayer.cs: Changeelse if (borderDashArray is null || borderDashArray.Length == 0)to plainelse - Windows
BorderExtensions.cs: ReplaceborderPath.StrokeDashArray = nullwith theClear()-based pattern (Copilot reviewer suggestion); also clear collection beforeAdd()to fix accumulation bug - Android snapshots: Regenerate from CI/gate environment (not local dev machine)
Issue29898.cs(HostApp): ChangePlatformAffected.iOS→PlatformAffected.All; add newline at EOFIssue29898.cs(Tests): AddretryTimeout: TimeSpan.FromSeconds(2)to bothVerifyScreenshot()calls; add newline at EOF
kubaflo
left a comment
There was a problem hiding this comment.
Could you please add iOS 26 screenshots?
@kubaflo , I have included the iOS 26 screenshots |
🚦 Gate - Test Before and After Fix📊 Expand Full Gate —
|
| 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.ymlsrc/Core/src/Platform/Windows/BorderExtensions.cssrc/Core/src/Platform/Windows/StrokeExtensions.cssrc/Core/src/Platform/iOS/MauiCALayer.cs

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.
iOS-BeforeFix.mov
iOS-AfterFix.mov