Skip to content

[Windows] Fix: StrokeLineCap values have no effect on Windows platform - #36442

Merged
kubaflo merged 3 commits into
dotnet:inflight/currentfrom
SubhikshaSf4851:Fix-29741
Jul 9, 2026
Merged

kubaflo merged 3 commits into
dotnet:inflight/currentfrom
SubhikshaSf4851:Fix-29741

Conversation

@SubhikshaSf4851

Copy link
Copy Markdown
Contributor

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 whether this change resolves your issue. Thank you!

This pull request addresses the handling of stroke line caps for borders on Windows and updates related tests. The main focus is to ensure that StrokeDashCap is set correctly along with StrokeStartLineCap and StrokeEndLineCap, and to enable previously disabled tests now that the related issues are resolved.

Description of Change

Platform rendering improvements:

  • Updated UpdateStrokeLineCap in BorderExtensions.cs to set StrokeDashCap in addition to StrokeStartLineCap and StrokeEndLineCap, ensuring consistent rendering of dashed borders on Windows.

Test updates:

  • Re-enabled previously disabled border stroke dash array tests for Windows in BorderFeatureTests.cs, allowing them to run on all platforms now that the underlying issues are fixed. [1] [2]

Issues Fixed

Fixes #29741

Tested the behavior in the following platforms

  • Windows
  • Android
  • iOS
  • Mac

Snapshots :

Before Fix After Fix
BeforeFix29741 AfterFix29471

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

🚀 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 -- 36442

Or

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

@dotnet-policy-service dotnet-policy-service Bot added the community ✨ Community Contribution label Jul 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Hey there @@SubhikshaSf4851! 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 Jul 8, 2026
@vishnumenon2684

Copy link
Copy Markdown
Contributor

/azp run

@azure-pipelines

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

@sheiksyedm
sheiksyedm marked this pull request as ready for review July 8, 2026 07:44
Copilot AI review requested due to automatic review settings July 8, 2026 07:44

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 fixes Windows border rendering so StrokeLineCap affects dashed border segments by setting the WinUI Path.StrokeDashCap alongside StrokeStartLineCap/StrokeEndLineCap, and it re-enables the previously Windows-disabled UI tests that validate this behavior.

Changes:

  • Update Windows BorderExtensions.UpdateStrokeLineCap to also set StrokeDashCap.
  • Remove the Windows-only preprocessor guard so StrokeLineCap + dash array tests run on Windows again.

Reviewed changes

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

File Description
src/Core/src/Platform/Windows/BorderExtensions.cs Ensures WinUI Path dash segments honor the configured stroke line cap by setting StrokeDashCap.
src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/BorderFeatureTests.cs Re-enables the StrokeLineCap + dash array screenshot tests for Windows by removing the conditional compilation block.

@kubaflo

This comment has been minimized.

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jul 8, 2026

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Expert Review — 1 findings

See inline comments for details.

@MauiBot MauiBot added s/agent-gate-failed AI could not verify tests catch the bug s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels Jul 8, 2026
MauiBot

This comment was marked as outdated.

@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Jul 8, 2026
@github-actions github-actions Bot added s/agent-review-in-progress AI review is currently running for this PR and removed s/agent-review-in-progress AI review is currently running for this PR labels Jul 8, 2026
Copilot AI review requested due to automatic review settings July 8, 2026 14:00
@vishnumenon2684

Copy link
Copy Markdown
Contributor

/azp run maui-pr-uitests

@azure-pipelines

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

Copilot AI review requested due to automatic review settings July 9, 2026 10:14

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 2 out of 8 changed files in this pull request and generated no new comments.

@kubaflo

This comment has been minimized.

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Expert Review — 1 findings

See inline comments for details.

}

// ── DashArray + StrokeLineCap tests disabled for Windows (Order 19–24) ──
// ── DashArray + StrokeLineCap tests (Order 26–31) ──

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🔍 AI-Generated Review (multi-model)

[major] Regression Prevention — The re-enabled Windows StrokeLineCap screenshot cases do not actually guard this fix: the gate ran BorderFeatureTests against main without the BorderExtensions change and all 32 tests still passed, so a regression that stops assigning Path.StrokeDashCap would merge unnoticed. Strengthen this block with a focused assertion/cropped or lower-tolerance screenshot that fails when StrokeDashCap remains at the WinUI default.

MauiBot

This comment was marked as outdated.

@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Jul 9, 2026

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review Summary

@SubhikshaSf4851 — new AI review results are available based on this last commit: 3db621c. To request a fresh review after new comments or commits, comment /review rerun.

Gate Partial Confidence Low Platform Windows


🗂️ Review Sessions — click to expand
🚦 Gate — Test Before & After Fix

Gate Result: ❌ FAILED

Platform: WINDOWS · Base: main · Merge base: 5535b43c

🩺 Test does not reproduce the bug — ran the same in both states (PASS without fix, PASS with fix). The repro test is not exercising the issue. Strengthen the test before reviewing the fix.

Test Without Fix (expect FAIL) With Fix (expect PASS)
🖥️ BorderFeatureTests BorderFeatureTests ❌ PASS — 2178s ✅ PASS — 680s
🔴 Without fix — 🖥️ BorderFeatureTests: PASS ❌ · 2178s

(truncated to last 15,000 chars)

 compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(8,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(9,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(10,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(11,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(12,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(13,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
    90 Warning(s)
    0 Error(s)

Time Elapsed 00:06:28.72
  Determining projects to restore...
  Restored D:\a\1\s\src\Controls\tests\CustomAttributes\Controls.CustomAttributes.csproj (in 867 ms).
  Restored D:\a\1\s\src\TestUtils\src\VisualTestUtils\VisualTestUtils.csproj (in 5 ms).
  Restored D:\a\1\s\src\TestUtils\src\VisualTestUtils.MagickNet\VisualTestUtils.MagickNet.csproj (in 6.32 sec).
  Restored D:\a\1\s\src\Controls\tests\TestCases.WinUI.Tests\Controls.TestCases.WinUI.Tests.csproj (in 11.04 sec).
  Restored D:\a\1\s\src\TestUtils\src\UITest.Core\UITest.Core.csproj (in 2 ms).
  Restored D:\a\1\s\src\TestUtils\src\UITest.NUnit\UITest.NUnit.csproj (in 2.57 sec).
  Restored D:\a\1\s\src\TestUtils\src\UITest.Appium\UITest.Appium.csproj (in 2 ms).
  Restored D:\a\1\s\src\TestUtils\src\UITest.Analyzers\UITest.Analyzers.csproj (in 5.1 sec).
  7 of 15 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14610200
  Graphics -> D:\a\1\s\artifacts\bin\Graphics\Debug\net10.0\Microsoft.Maui.Graphics.dll
  Controls.CustomAttributes -> D:\a\1\s\artifacts\bin\Controls.CustomAttributes\Debug\net10.0\Controls.CustomAttributes.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14610200
  Essentials -> D:\a\1\s\artifacts\bin\Essentials\Debug\net10.0\Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14610200
  Core -> D:\a\1\s\artifacts\bin\Core\Debug\net10.0\Microsoft.Maui.dll
  Controls.Core.Design -> D:\a\1\s\artifacts\bin\Controls.Core.Design\Debug\net472\Microsoft.Maui.Controls.DesignTools.dll
  Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Debug\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14610200
  Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Debug\net10.0\Microsoft.Maui.Controls.dll
  UITest.Core -> D:\a\1\s\artifacts\bin\UITest.Core\Debug\net10.0\UITest.Core.dll
  VisualTestUtils -> D:\a\1\s\artifacts\bin\VisualTestUtils\Debug\netstandard2.0\VisualTestUtils.dll
  UITest.Appium -> D:\a\1\s\artifacts\bin\UITest.Appium\Debug\net10.0\UITest.Appium.dll
  UITest.NUnit -> D:\a\1\s\artifacts\bin\UITest.NUnit\Debug\net10.0\UITest.NUnit.dll
  VisualTestUtils.MagickNet -> D:\a\1\s\artifacts\bin\VisualTestUtils.MagickNet\Debug\netstandard2.0\VisualTestUtils.MagickNet.dll
  UITest.Analyzers -> D:\a\1\s\artifacts\bin\UITest.Analyzers\Debug\netstandard2.0\UITest.Analyzers.dll
  Controls.TestCases.WinUI.Tests -> D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
Test run for D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
   NUnit3TestExecutor discovered 32 of 32 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 7/9/2026 11:34:45 AM FixtureSetup for BorderFeatureTests(Windows)
>>>>> 7/9/2026 11:34:57 AM Border_DefaultValues Start
>>>>> 7/9/2026 11:34:58 AM Border_DefaultValues Stop
>>>>> 7/9/2026 11:34:58 AM Border_PaddingWithContent_Label Start
  Passed Border_DefaultValues [836 ms]
>>>>> 7/9/2026 11:35:03 AM Border_PaddingWithContent_Label Stop
  Passed Border_PaddingWithContent_Label [5 s]
>>>>> 7/9/2026 11:35:03 AM Border_PaddingWithContent_Image Start
>>>>> 7/9/2026 11:35:09 AM Border_PaddingWithContent_Image Stop
  Passed Border_PaddingWithContent_Image [5 s]
>>>>> 7/9/2026 11:35:09 AM Border_StrokeColorWithContent_Button Start
>>>>> 7/9/2026 11:35:14 AM Border_StrokeColorWithContent_Button Stop
  Passed Border_StrokeColorWithContent_Button [4 s]
>>>>> 7/9/2026 11:35:14 AM Border_StrokeColorWithStrokeShape_RoundRectangle Start
>>>>> 7/9/2026 11:35:19 AM Border_StrokeColorWithStrokeShape_RoundRectangle Stop
  Passed Border_StrokeColorWithStrokeShape_RoundRectangle [5 s]
>>>>> 7/9/2026 11:35:19 AM Border_StrokeColorWithStrokeThickness Start
>>>>> 7/9/2026 11:35:24 AM Border_StrokeColorWithStrokeThickness Stop
  Passed Border_StrokeColorWithStrokeThickness [4 s]
>>>>> 7/9/2026 11:35:24 AM Border_StrokeShapeWithStrokeThickness_Ellipse Start
>>>>> 7/9/2026 11:35:29 AM Border_StrokeShapeWithStrokeThickness_Ellipse Stop
  Passed Border_StrokeShapeWithStrokeThickness_Ellipse [4 s]
>>>>> 7/9/2026 11:35:29 AM Border_StrokeShape_Path Start
>>>>> 7/9/2026 11:35:34 AM Border_StrokeShape_Path Stop
  Passed Border_StrokeShape_Path [4 s]
>>>>> 7/9/2026 11:35:34 AM Border_Shadow Start
>>>>> 7/9/2026 11:35:41 AM Border_Shadow Stop
  Passed Border_Shadow [7 s]
>>>>> 7/9/2026 11:35:41 AM Border_StrokeMiterLimitWithStrokeLineJoin_Miter Start
>>>>> 7/9/2026 11:35:47 AM Border_StrokeMiterLimitWithStrokeLineJoin_Miter Stop
  Passed Border_StrokeMiterLimitWithStrokeLineJoin_Miter [5 s]
>>>>> 7/9/2026 11:35:47 AM Border_StrokeShapeWithStrokeLineJoin_Bevel Start
>>>>> 7/9/2026 11:35:53 AM Border_StrokeShapeWithStrokeLineJoin_Bevel Stop
  Passed Border_StrokeShapeWithStrokeLineJoin_Bevel [6 s]
>>>>> 7/9/2026 11:35:53 AM Border_StrokeColorWithStrokeLineJoin_Round Start
>>>>> 7/9/2026 11:35:58 AM Border_StrokeColorWithStrokeLineJoin_Round Stop
  Passed Border_StrokeColorWithStrokeLineJoin_Round [4 s]
>>>>> 7/9/2026 11:35:58 AM Border_StrokeThicknessWithStrokeLineJoin_Bevel Start
>>>>> 7/9/2026 11:36:02 AM Border_StrokeThicknessWithStrokeLineJoin_Bevel Stop
  Passed Border_StrokeThicknessWithStrokeLineJoin_Bevel [4 s]
>>>>> 7/9/2026 11:36:02 AM Border_PolygonShapeWithStrokeLineJoin_Bevel Start
>>>>> 7/9/2026 11:36:08 AM Border_PolygonShapeWithStrokeLineJoin_Bevel Stop
  Passed Border_PolygonShapeWithStrokeLineJoin_Bevel [6 s]
>>>>> 7/9/2026 11:36:08 AM Border_StrokeShapeWithPolygon Start
>>>>> 7/9/2026 11:36:13 AM Border_StrokeShapeWithPolygon Stop
  Passed Border_StrokeShapeWithPolygon [4 s]
>>>>> 7/9/2026 11:36:13 AM Border_StrokeColorWithRed Start
>>>>> 7/9/2026 11:36:18 AM Border_StrokeColorWithRed Stop
  Passed Border_StrokeColorWithRed [4 s]
>>>>> 7/9/2026 11:36:18 AM Border_StrokeShapeRectangle_AfterChange Start
>>>>> 7/9/2026 11:36:24 AM Border_StrokeShapeRectangle_AfterChange Stop
  Passed Border_StrokeShapeRectangle_AfterChange [5 s]
>>>>> 7/9/2026 11:36:24 AM Border_ShadowWithColor Start
>>>>> 7/9/2026 11:36:33 AM Border_ShadowWithColor Stop
  Passed Border_ShadowWithColor [9 s]
>>>>> 7/9/2026 11:36:33 AM Border_BackgroundColor Start
>>>>> 7/9/2026 11:36:38 AM Border_BackgroundColor Stop
  Passed Border_BackgroundColor [4 s]
>>>>> 7/9/2026 11:36:38 AM Border_StrokeGradientBrush Start
>>>>> 7/9/2026 11:36:43 AM Border_StrokeGradientBrush Stop
  Passed Border_StrokeGradientBrush [5 s]
>>>>> 7/9/2026 11:36:43 AM Border_ZeroPadding Start
>>>>> 7/9/2026 11:36:47 AM Border_ZeroPadding Stop
  Passed Border_ZeroPadding [4 s]
>>>>> 7/9/2026 11:36:47 AM Border_StrokeShapeWithDashArray_Path Start
>>>>> 7/9/2026 11:36:53 AM Border_StrokeShapeWithDashArray_Path Stop
  Passed Border_StrokeShapeWithDashArray_Path [6 s]
>>>>> 7/9/2026 11:36:53 AM Border_StrokeThicknessWithDashArray Start
>>>>> 7/9/2026 11:36:58 AM Border_StrokeThicknessWithDashArray Stop
  Passed Border_StrokeThicknessWithDashArray [5 s]
>>>>> 7/9/2026 11:36:58 AM Border_StrokeDashArrayWithDashOffset Start
>>>>> 7/9/2026 11:37:04 AM Border_StrokeDashArrayWithDashOffset Stop
  Passed Border_StrokeDashArrayWithDashOffset [5 s]
>>>>> 7/9/2026 11:37:04 AM Border_StrokeDashArrayWithStrokeColor Start
>>>>> 7/9/2026 11:37:11 AM Border_StrokeDashArrayWithStrokeColor Stop
  Passed Border_StrokeDashArrayWithStrokeColor [6 s]
>>>>> 7/9/2026 11:37:11 AM Border_StrokeDashArrayWithStrokeLineCap_Flat Start
>>>>> 7/9/2026 11:37:17 AM Border_StrokeDashArrayWithStrokeLineCap_Flat Stop
  Passed Border_StrokeDashArrayWithStrokeLineCap_Flat [5 s]
>>>>> 7/9/2026 11:37:17 AM Border_StrokeDashArrayWithStrokeLineCap_Round Start
>>>>> 7/9/2026 11:37:24 AM Border_StrokeDashArrayWithStrokeLineCap_Round Stop
  Passed Border_StrokeDashArrayWithStrokeLineCap_Round [7 s]
>>>>> 7/9/2026 11:37:24 AM Border_StrokeDashArrayWithDashOffsetAndStrokeLineCapRound Start
>>>>> 7/9/2026 11:37:31 AM Border_StrokeDashArrayWithDashOffsetAndStrokeLineCapRound Stop
  Passed Border_StrokeDashArrayWithDashOffsetAndStrokeLineCapRound [7 s]
>>>>> 7/9/2026 11:37:31 AM Border_StrokeDashArrayWithStrokeLineCap_Square Start
>>>>> 7/9/2026 11:37:37 AM Border_StrokeDashArrayWithStrokeLineCap_Square Stop
  Passed Border_StrokeDashArrayWithStrokeLineCap_Square [6 s]
>>>>> 7/9/2026 11:37:38 AM Border_StrokeDashArrayWithEllipseShapeAndStrokeLineCap_Square Start
>>>>> 7/9/2026 11:37:45 AM Border_StrokeDashArrayWithEllipseShapeAndStrokeLineCap_Square Stop
  Passed Border_StrokeDashArrayWithEllipseShapeAndStrokeLineCap_Square [7 s]
>>>>> 7/9/2026 11:37:45 AM Border_PolygonShapeWithStrokeLineCap_Round Start
>>>>> 7/9/2026 11:37:52 AM Border_PolygonShapeWithStrokeLineCap_Round Stop
  Passed Border_PolygonShapeWithStrokeLineCap_Round [7 s]
>>>>> 7/9/2026 11:37:52 AM Border_StrokeColorWithDashArrayAndOffset Start
>>>>> 7/9/2026 11:38:00 AM Border_StrokeColorWithDashArrayAndOffset Stop
  Passed Border_StrokeColorWithDashArrayAndOffset [7 s]
NUnit Adapter 4.5.0.0: Test execution complete
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.12]   Discovering: Controls.TestCases.WinUI.Tests
[xUnit.net 00:00:00.33]   Discovered:  Controls.TestCases.WinUI.Tests
Results File: D:\a\1\s\CustomAgentLogsTmp\UITests\TestResults\BorderFeatureTests.trx

Test Run Successful.
Total tests: 32
     Passed: 32
 Total time: 3.6105 Minutes
>>> TRX_RESULT_FILE: D:\a\1\s\CustomAgentLogsTmp\UITests\TestResults\BorderFeatureTests.trx

🟢 With fix — 🖥️ BorderFeatureTests: PASS ✅ · 680s

(truncated to last 15,000 chars)

c\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\Styles\ShellStyles.xaml(15,57): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(8,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(9,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(10,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(11,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(12,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
Platform\Windows\TabbedPage\TabbedPageStyle.xaml(13,13): XamlCompiler warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive with the respective binding data context and marking the type declaration with the 'WinRT.GeneratedBindableCustomProperty' attribute or the 'Microsoft.UI.Xaml.Data.Bindable' attribute. If you are unable to do either but can ensure the data type is attributed correctly, then you can also suppress the warning by specifying `x:SuppressXamlTrimWarnings=True` within the closest element. If not, the property path might be trimmed and will not be AOT compatible. [D:\a\1\s\src\Controls\src\Core\Controls.Core.csproj::TargetFramework=net10.0-windows10.0.19041.0]
    90 Warning(s)
    0 Error(s)

Time Elapsed 00:06:10.57
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14610200
  Graphics -> D:\a\1\s\artifacts\bin\Graphics\Debug\net10.0\Microsoft.Maui.Graphics.dll
  Controls.CustomAttributes -> D:\a\1\s\artifacts\bin\Controls.CustomAttributes\Debug\net10.0\Controls.CustomAttributes.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14610200
  Essentials -> D:\a\1\s\artifacts\bin\Essentials\Debug\net10.0\Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14610200
  Core -> D:\a\1\s\artifacts\bin\Core\Debug\net10.0\Microsoft.Maui.dll
  Controls.Core.Design -> D:\a\1\s\artifacts\bin\Controls.Core.Design\Debug\net472\Microsoft.Maui.Controls.DesignTools.dll
  Controls.BindingSourceGen -> D:\a\1\s\artifacts\bin\Controls.BindingSourceGen\Debug\netstandard2.0\Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.90-ci+azdo.14610200
  Controls.Core -> D:\a\1\s\artifacts\bin\Controls.Core\Debug\net10.0\Microsoft.Maui.Controls.dll
  UITest.Core -> D:\a\1\s\artifacts\bin\UITest.Core\Debug\net10.0\UITest.Core.dll
  UITest.Appium -> D:\a\1\s\artifacts\bin\UITest.Appium\Debug\net10.0\UITest.Appium.dll
  UITest.NUnit -> D:\a\1\s\artifacts\bin\UITest.NUnit\Debug\net10.0\UITest.NUnit.dll
  VisualTestUtils -> D:\a\1\s\artifacts\bin\VisualTestUtils\Debug\netstandard2.0\VisualTestUtils.dll
  VisualTestUtils.MagickNet -> D:\a\1\s\artifacts\bin\VisualTestUtils.MagickNet\Debug\netstandard2.0\VisualTestUtils.MagickNet.dll
  UITest.Analyzers -> D:\a\1\s\artifacts\bin\UITest.Analyzers\Debug\netstandard2.0\UITest.Analyzers.dll
  Controls.TestCases.WinUI.Tests -> D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
Test run for D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (x64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
NUnit Adapter 4.5.0.0: Test execution started
Running selected tests in D:\a\1\s\artifacts\bin\Controls.TestCases.WinUI.Tests\Debug\net10.0\Controls.TestCases.WinUI.Tests.dll
   NUnit3TestExecutor discovered 32 of 32 NUnit test cases using Current Discovery mode, Non-Explicit run
>>>>> 7/9/2026 12:09:09 PM FixtureSetup for BorderFeatureTests(Windows)
>>>>> 7/9/2026 12:09:20 PM Border_DefaultValues Start
>>>>> 7/9/2026 12:09:21 PM Border_DefaultValues Stop
>>>>> 7/9/2026 12:09:21 PM Border_PaddingWithContent_Label Start
  Passed Border_DefaultValues [852 ms]
>>>>> 7/9/2026 12:09:27 PM Border_PaddingWithContent_Label Stop
  Passed Border_PaddingWithContent_Label [5 s]
>>>>> 7/9/2026 12:09:27 PM Border_PaddingWithContent_Image Start
>>>>> 7/9/2026 12:09:33 PM Border_PaddingWithContent_Image Stop
  Passed Border_PaddingWithContent_Image [6 s]
>>>>> 7/9/2026 12:09:34 PM Border_StrokeColorWithContent_Button Start
>>>>> 7/9/2026 12:09:38 PM Border_StrokeColorWithContent_Button Stop
  Passed Border_StrokeColorWithContent_Button [4 s]
>>>>> 7/9/2026 12:09:38 PM Border_StrokeColorWithStrokeShape_RoundRectangle Start
>>>>> 7/9/2026 12:09:43 PM Border_StrokeColorWithStrokeShape_RoundRectangle Stop
  Passed Border_StrokeColorWithStrokeShape_RoundRectangle [5 s]
>>>>> 7/9/2026 12:09:43 PM Border_StrokeColorWithStrokeThickness Start
>>>>> 7/9/2026 12:09:49 PM Border_StrokeColorWithStrokeThickness Stop
  Passed Border_StrokeColorWithStrokeThickness [5 s]
>>>>> 7/9/2026 12:09:49 PM Border_StrokeShapeWithStrokeThickness_Ellipse Start
>>>>> 7/9/2026 12:09:54 PM Border_StrokeShapeWithStrokeThickness_Ellipse Stop
  Passed Border_StrokeShapeWithStrokeThickness_Ellipse [4 s]
>>>>> 7/9/2026 12:09:54 PM Border_StrokeShape_Path Start
>>>>> 7/9/2026 12:09:58 PM Border_StrokeShape_Path Stop
  Passed Border_StrokeShape_Path [4 s]
>>>>> 7/9/2026 12:09:58 PM Border_Shadow Start
>>>>> 7/9/2026 12:10:06 PM Border_Shadow Stop
  Passed Border_Shadow [8 s]
>>>>> 7/9/2026 12:10:06 PM Border_StrokeMiterLimitWithStrokeLineJoin_Miter Start
>>>>> 7/9/2026 12:10:12 PM Border_StrokeMiterLimitWithStrokeLineJoin_Miter Stop
  Passed Border_StrokeMiterLimitWithStrokeLineJoin_Miter [5 s]
>>>>> 7/9/2026 12:10:12 PM Border_StrokeShapeWithStrokeLineJoin_Bevel Start
>>>>> 7/9/2026 12:10:18 PM Border_StrokeShapeWithStrokeLineJoin_Bevel Stop
  Passed Border_StrokeShapeWithStrokeLineJoin_Bevel [6 s]
>>>>> 7/9/2026 12:10:18 PM Border_StrokeColorWithStrokeLineJoin_Round Start
>>>>> 7/9/2026 12:10:23 PM Border_StrokeColorWithStrokeLineJoin_Round Stop
  Passed Border_StrokeColorWithStrokeLineJoin_Round [4 s]
>>>>> 7/9/2026 12:10:23 PM Border_StrokeThicknessWithStrokeLineJoin_Bevel Start
>>>>> 7/9/2026 12:10:28 PM Border_StrokeThicknessWithStrokeLineJoin_Bevel Stop
  Passed Border_StrokeThicknessWithStrokeLineJoin_Bevel [4 s]
>>>>> 7/9/2026 12:10:28 PM Border_PolygonShapeWithStrokeLineJoin_Bevel Start
>>>>> 7/9/2026 12:10:34 PM Border_PolygonShapeWithStrokeLineJoin_Bevel Stop
  Passed Border_PolygonShapeWithStrokeLineJoin_Bevel [6 s]
>>>>> 7/9/2026 12:10:34 PM Border_StrokeShapeWithPolygon Start
>>>>> 7/9/2026 12:10:39 PM Border_StrokeShapeWithPolygon Stop
  Passed Border_StrokeShapeWithPolygon [4 s]
>>>>> 7/9/2026 12:10:39 PM Border_StrokeColorWithRed Start
>>>>> 7/9/2026 12:10:44 PM Border_StrokeColorWithRed Stop
  Passed Border_StrokeColorWithRed [4 s]
>>>>> 7/9/2026 12:10:44 PM Border_StrokeShapeRectangle_AfterChange Start
>>>>> 7/9/2026 12:10:51 PM Border_StrokeShapeRectangle_AfterChange Stop
  Passed Border_StrokeShapeRectangle_AfterChange [6 s]
>>>>> 7/9/2026 12:10:51 PM Border_ShadowWithColor Start
>>>>> 7/9/2026 12:10:59 PM Border_ShadowWithColor Stop
  Passed Border_ShadowWithColor [8 s]
>>>>> 7/9/2026 12:10:59 PM Border_BackgroundColor Start
>>>>> 7/9/2026 12:11:03 PM Border_BackgroundColor Stop
  Passed Border_BackgroundColor [3 s]
>>>>> 7/9/2026 12:11:03 PM Border_StrokeGradientBrush Start
>>>>> 7/9/2026 12:11:08 PM Border_StrokeGradientBrush Stop
  Passed Border_StrokeGradientBrush [4 s]
>>>>> 7/9/2026 12:11:08 PM Border_ZeroPadding Start
>>>>> 7/9/2026 12:11:13 PM Border_ZeroPadding Stop
  Passed Border_ZeroPadding [5 s]
>>>>> 7/9/2026 12:11:13 PM Border_StrokeShapeWithDashArray_Path Start
>>>>> 7/9/2026 12:11:19 PM Border_StrokeShapeWithDashArray_Path Stop
  Passed Border_StrokeShapeWithDashArray_Path [6 s]
>>>>> 7/9/2026 12:11:19 PM Border_StrokeThicknessWithDashArray Start
>>>>> 7/9/2026 12:11:24 PM Border_StrokeThicknessWithDashArray Stop
  Passed Border_StrokeThicknessWithDashArray [4 s]
>>>>> 7/9/2026 12:11:24 PM Border_StrokeDashArrayWithDashOffset Start
>>>>> 7/9/2026 12:11:31 PM Border_StrokeDashArrayWithDashOffset Stop
  Passed Border_StrokeDashArrayWithDashOffset [6 s]
>>>>> 7/9/2026 12:11:31 PM Border_StrokeDashArrayWithStrokeColor Start
>>>>> 7/9/2026 12:11:38 PM Border_StrokeDashArrayWithStrokeColor Stop
  Passed Border_StrokeDashArrayWithStrokeColor [7 s]
>>>>> 7/9/2026 12:11:38 PM Border_StrokeDashArrayWithStrokeLineCap_Flat Start
>>>>> 7/9/2026 12:11:45 PM Border_StrokeDashArrayWithStrokeLineCap_Flat Stop
  Passed Border_StrokeDashArrayWithStrokeLineCap_Flat [7 s]
>>>>> 7/9/2026 12:11:45 PM Border_StrokeDashArrayWithStrokeLineCap_Round Start
>>>>> 7/9/2026 12:11:52 PM Border_StrokeDashArrayWithStrokeLineCap_Round Stop
  Passed Border_StrokeDashArrayWithStrokeLineCap_Round [6 s]
>>>>> 7/9/2026 12:11:52 PM Border_StrokeDashArrayWithDashOffsetAndStrokeLineCapRound Start
>>>>> 7/9/2026 12:11:59 PM Border_StrokeDashArrayWithDashOffsetAndStrokeLineCapRound Stop
  Passed Border_StrokeDashArrayWithDashOffsetAndStrokeLineCapRound [7 s]
>>>>> 7/9/2026 12:11:59 PM Border_StrokeDashArrayWithStrokeLineCap_Square Start
>>>>> 7/9/2026 12:12:06 PM Border_StrokeDashArrayWithStrokeLineCap_Square Stop
  Passed Border_StrokeDashArrayWithStrokeLineCap_Square [7 s]
>>>>> 7/9/2026 12:12:07 PM Border_StrokeDashArrayWithEllipseShapeAndStrokeLineCap_Square Start
>>>>> 7/9/2026 12:12:15 PM Border_StrokeDashArrayWithEllipseShapeAndStrokeLineCap_Square Stop
  Passed Border_StrokeDashArrayWithEllipseShapeAndStrokeLineCap_Square [8 s]
>>>>> 7/9/2026 12:12:15 PM Border_PolygonShapeWithStrokeLineCap_Round Start
>>>>> 7/9/2026 12:12:23 PM Border_PolygonShapeWithStrokeLineCap_Round Stop
  Passed Border_PolygonShapeWithStrokeLineCap_Round [7 s]
>>>>> 7/9/2026 12:12:23 PM Border_StrokeColorWithDashArrayAndOffset Start
>>>>> 7/9/2026 12:12:30 PM Border_StrokeColorWithDashArrayAndOffset Stop
  Passed Border_StrokeColorWithDashArrayAndOffset [7 s]
NUnit Adapter 4.5.0.0: Test execution complete
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.10]   Discovering: Controls.TestCases.WinUI.Tests
[xUnit.net 00:00:00.30]   Discovered:  Controls.TestCases.WinUI.Tests
Results File: D:\a\1\s\CustomAgentLogsTmp\UITests\TestResults\BorderFeatureTests.trx

Test Run Successful.
Total tests: 32
     Passed: 32
 Total time: 3.5972 Minutes
>>> TRX_RESULT_FILE: D:\a\1\s\CustomAgentLogsTmp\UITests\TestResults\BorderFeatureTests.trx

⚠️ Failure Details

  • ❌ BorderFeatureTests PASSED without fix (should fail) — tests don't catch the bug
📁 Fix files reverted (1 files)
  • src/Core/src/Platform/Windows/BorderExtensions.cs

📱 UI Tests — Border,ViewBaseTests

Detected UI test categories: Border,ViewBaseTests

✅ Deep UI tests — 164 passed, 0 failed across 2 categories on platform-pool agent (replaces in-process counts above).

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
Border 49/49 ✓ —
ViewBaseTests 115/115 ✓ —
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)

📋 Pre-Flight — Context & Validation

Issue: #29741 - StrokeLineCap values have no effect on Windows platform
PR: #36442 - [Windows] Fix: StrokeLineCap values have no effect on Windows platform
Platforms Affected: Windows
Files Changed: 1 implementation, 7 test

Key Findings

  • Issue #29741 reports StrokeLineCap visually affects Android, iOS, and macOS but has no visible impact on Windows; it was verified reproducible on Windows.
  • PR implementation sets WinUI Path.StrokeDashCap along with start/end caps in BorderExtensions.UpdateStrokeLineCap.
  • PR test updates re-enable Windows Border FeatureMatrix screenshot cases and add six WinUI snapshot baselines.
  • Gate result provided to this run failed because BorderFeatureTests passed both without and with the fix; screenshot coverage does not prove the bug.

Code Review Summary

Verdict: NEEDS_DISCUSSION
Confidence: low
Errors: 0 | Warnings: 0 | Suggestions: 0

Key code review findings:

  • ℹ No high-confidence code findings; the product fix appears localized and technically aligned with WinUI dash-cap behavior.
  • ℹ Prior missing-baseline review findings appear addressed by added WinUI snapshot files.
  • ℹ CI/check status was undetermined because gh is unauthenticated in this environment and public status fallback showed pending/in-progress checks.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #36442 Set WinUI StrokeDashCap together with StrokeStartLineCap and StrokeEndLineCap; re-enable Windows screenshot tests and add baselines ❌ FAILED (Gate: tests pass both without and with fix) src\Core\src\Platform\Windows\BorderExtensions.cs, src\Controls\tests\TestCases.Shared.Tests\Tests\FeatureMatrix\BorderFeatureTests.cs, 6 WinUI snapshots Original PR; product fix likely correct, but test gate does not prove regression coverage.

🔬 Code Review — Deep Analysis

Code Review — PR #36442

Independent Assessment

What this changes: Windows BorderExtensions.UpdateStrokeLineCap now maps MAUI LineCap to WinUI Path.StrokeDashCap in addition to StrokeStartLineCap and StrokeEndLineCap (src\Core\src\Platform\Windows\BorderExtensions.cs:116). The PR also re-enables Windows screenshot coverage for dashed border StrokeLineCap cases and adds matching WinUI baselines.

Inferred motivation: Dashed Windows borders need StrokeDashCap set for each dash segment; start/end caps alone do not affect dash caps.

Reconciliation with PR Narrative

Author claims: Fixes #29741: StrokeLineCap had no visible effect on Windows; adds/reenables related tests and snapshots.

Agreement/disagreement: The code matches the claim. The linked issue describes Windows-only cap rendering differences, and WinUI StrokeDashCap is the relevant missing property.

Prior Review Reconciliation

Prior ❌ Error Finding Source Status Evidence
Re-enabled Windows screenshot tests lacked WinUI baselines MauiBot inline/review comments ✅ Fixed Latest PR commit adds six tracked files under src\Controls\tests\TestCases.WinUI.Tests\snapshots\windows\Border_*StrokeLineCap*.png.
Comment headers had stale order/platform wording Copilot inline comments ✅ Fixed Headers now say orders 26–31 and order 32.

Blast Radius Assessment

  • Runs for all instances: Windows Borders when UpdateStrokeLineCap is invoked; harmless for non-dashed strokes.
  • Startup impact: No.
  • Static/shared state: No.

CI Status

  • Required-check result: gh pr checks --required unavailable due missing GitHub CLI auth.
  • Public API fallback: head SHA 3db621c... had successful checks plus pending/in-progress/queued checks at review time; combined status pending.
  • Classification: undetermined/pending.
  • Action taken: Used public API fallback; confidence capped low; no LGTM.

Findings

No high-confidence ❌ Error, ⚠️ Warning, or 💡 Suggestion findings.

Failure-Mode Probing

  • Non-dashed borders: setting StrokeDashCap is benign; it only affects dashed strokes.
  • Null/default values: existing null guards remain unchanged.
  • Handler reconnect/new path: WrapperView.UpdateBorder reapplies line cap after creating _borderPath.
  • Unsupported enum/default path: existing switch defaults to WinUI Flat.

Verdict: NEEDS_DISCUSSION

Confidence: low
Summary: The code change is localized and appears correct, and prior missing-baseline findings are now addressed. However, CI is still pending/undetermined and GitHub CLI auth was unavailable, so this cannot be LGTM yet.


🛠️ Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 maui-expert-reviewer Dash-specific synchronization via UpdateStrokeDashCap called from dash-pattern, line-cap, and wrapper paths, plus direct WinUI StrokeDashCap Core device tests ❌ BLOCKED 4 files Build passed; direct dotnet test blocked by missing testhost; repo Windows device runner produced zero-byte result XML and failed summarization. Stronger validation idea, but not demonstrably better in this environment.
2 maui-expert-reviewer MauiBorderPath : Path self-synchronizes StrokeDashCap from StrokeStartLineCap; ContentPanel/WrapperView use it; direct native-property tests ❌ BLOCKED 5 files Build passed after partial fix; runtime validation blocked by missing testhost. More invasive than PR and not clearly better.
PR PR #36442 Set Path.StrokeDashCap together with start/end caps in BorderExtensions.UpdateStrokeLineCap; re-enable Windows screenshots and add baselines ❌ Gate failed 8 files Gate showed screenshots pass with and without fix, so regression coverage does not prove the bug.

Cross-Pollination

Model Round New Ideas? Details
maui-expert-reviewer 1 Yes Add property-level Windows Core device tests; product implementation via dash-specific synchronization.
maui-expert-reviewer 2 Yes Encapsulate cap invariant in a custom Windows MauiBorderPath.
maui-expert-reviewer 3 No NO NEW IDEAS; remaining options would be trivial variations or worse.

Exhausted: Yes
Selected Fix: PR's fix — no alternative candidate passed runtime validation or was demonstrably better. Candidate 1 had stronger test coverage but could not complete runtime validation locally; candidate 2 was more invasive and also runtime-blocked.


📝 Recommended PR Title & Description

Assessment: ✏️ Recommend updating — the winning pr-plus-reviewer fix adds focused Windows Core device tests that the current description does not mention, and the title can be made more component-specific.

Recommended title

[Windows] Border: Apply StrokeLineCap to dashed border caps

Recommended description

This pull request addresses the handling of stroke line caps for borders on Windows and updates related tests. The main focus is to ensure that WinUI `Path.StrokeDashCap` is set correctly along with `StrokeStartLineCap` and `StrokeEndLineCap`, so `StrokeLineCap` values affect dashed border segments on Windows.

### Root Cause

On Windows, dashed stroke segment caps are controlled by WinUI `Path.StrokeDashCap`. MAUI was only mapping `StrokeLineCap` to `StrokeStartLineCap` and `StrokeEndLineCap`, so dashed border segments kept the WinUI default dash cap and `StrokeLineCap` changes had no visible effect.

### Description of Change

**Platform rendering improvements:**

* Updated `UpdateStrokeLineCap` in `BorderExtensions.cs` to set `StrokeDashCap` in addition to `StrokeStartLineCap` and `StrokeEndLineCap`, ensuring consistent rendering of dashed borders on Windows.

**Test updates:**

* Re-enabled previously disabled border stroke dash array tests for Windows in `BorderFeatureTests.cs`, allowing them to run on all platforms now that the underlying issue is fixed.
* Added focused Windows Core device tests for `BorderHandler` that directly verify WinUI `BorderPath.StrokeDashCap` follows `StrokeLineCap` initially and after `StrokeLineCap` changes.

### Issues Fixed

Fixes #29741

### Tested the behavior in the following platforms

- [x] Windows
- [ ] Android
- [ ] iOS
- [ ] Mac

### Snapshots :

 | Before Fix | After Fix |
 |--------------------------|---------------------------|
 | <img width="1429" height="876" alt="BeforeFix29741" src="https://github.com/user-attachments/assets/34a7b94e-8da0-4aba-97ea-d38d32558656" /> | <img width="1285" height="1016" alt="AfterFix29471" src="https://github.com/user-attachments/assets/eae441de-e66c-40aa-af63-97519b1866ab" />|

🏁 Report — Final Recommendation

Comparative Analysis — PR #36442

Candidates Compared

Rank Candidate Product approach Regression result Assessment
1 pr-plus-reviewer Same localized PR fix: assign WinUI Path.StrokeDashCap together with start/end caps in BorderExtensions.UpdateStrokeLineCap; adds focused Windows Core device tests that inspect BorderPath.StrokeDashCap directly. Gate not rerun; sandbox build blocked by unbuilt MSBuild tasks in detached worktree. Best balance: keeps the correct minimal product fix and directly addresses the expert reviewer's high-confidence test-coverage finding.
2 try-fix-1 Adds dash-specific UpdateStrokeDashCap and calls it from dash-pattern, line-cap, and wrapper paths; adds direct Windows Core device tests. Build passed; focused runtime tests blocked by missing VSTest testhost and device runner result summarization failure. Strong testing idea, but product code is more invasive than necessary and not demonstrably better than the PR product fix plus the same direct-test concept.
3 pr Assigns StrokeDashCap alongside StrokeStartLineCap and StrokeEndLineCap; re-enables Windows screenshot tests and adds baselines. Gate failed: screenshot tests passed without the product fix and with it. Product fix appears correct and minimal, but the submitted regression coverage does not prove the bug. Per ranking rule, this failed-gate candidate ranks below the PR-plus-reviewer candidate.
4 try-fix-2 Introduces Windows-only MauiBorderPath : Path to self-synchronize StrokeDashCap from StrokeStartLineCap; wires it into ContentPanel and WrapperView; adds direct property tests. Build passed after partial correction; focused runtime tests blocked by missing VSTest testhost. More invasive than needed and changes the platform view abstraction for all Windows borders; no evidence it improves correctness over the localized PR fix.

Key Findings

  • The raw PR product fix is technically aligned with WinUI: dashed stroke segment caps are controlled by Path.StrokeDashCap, not only StrokeStartLineCap/StrokeEndLineCap.
  • The gate failure is about regression proof, not product-code failure: BorderFeatureTests passed in both without-fix and with-fix states.
  • The expert reviewer produced one actionable inline finding against the re-enabled screenshot block and recommended adding a focused Windows Core device test that directly asserts StrokeDashCap.
  • try-fix-1 independently reached the same important testing insight, but its product approach spreads synchronization across multiple call sites. pr-plus-reviewer captures the useful test improvement while preserving the simpler PR implementation.
  • try-fix-2 is lowest because it introduces a new Windows Path subtype and broader behavior coupling for a one-property synchronization issue.

Winning Candidate

Winner: pr-plus-reviewer

Rationale: It keeps the PR's minimal, localized, and apparently correct Windows rendering fix while addressing the only expert-review finding: the current screenshot tests do not fail without the product fix. None of the alternatives produced passing runtime regression verification, and the try-fix product approaches are more invasive than necessary.


🧭 Next Steps — review latest findings

No alternative fix was selected for this run. Review the session findings and CI results before merging.

@kubaflo
kubaflo changed the base branch from main to inflight/current July 9, 2026 20:32
@kubaflo
kubaflo merged commit 31fd4f3 into dotnet:inflight/current Jul 9, 2026
32 checks passed
@github-actions github-actions Bot added this to the .NET 10 SR9 milestone Jul 9, 2026
kubaflo pushed a commit that referenced this pull request Jul 10, 2026
#36442)

<!-- Please keep the note below for people who find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment whether this change resolves your
issue. Thank you!<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!! -->

This pull request addresses the handling of stroke line caps for borders
on Windows and updates related tests. The main focus is to ensure that
`StrokeDashCap` is set correctly along with `StrokeStartLineCap` and
`StrokeEndLineCap`, and to enable previously disabled tests now that the
related issues are resolved.

### Description of Change

**Platform rendering improvements:**

* Updated `UpdateStrokeLineCap` in `BorderExtensions.cs` to set
`StrokeDashCap` in addition to `StrokeStartLineCap` and
`StrokeEndLineCap`, ensuring consistent rendering of dashed borders on
Windows.

**Test updates:**

* Re-enabled previously disabled border stroke dash array tests for
Windows in `BorderFeatureTests.cs`, allowing them to run on all
platforms now that the underlying issues are fixed.
[[1]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L502)
[[2]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L631)


<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #29741 

### Tested the behavior in the following platforms

- [x] Windows
- [ ] Android
- [ ] iOS
- [ ] Mac


### Snapshots :

 | Before Fix | After Fix |
 |--------------------------|---------------------------|
| <img width="1429" height="876" alt="BeforeFix29741"
src="https://github.com/user-attachments/assets/34a7b94e-8da0-4aba-97ea-d38d32558656"
/> | <img width="1285" height="1016" alt="AfterFix29471"
src="https://github.com/user-attachments/assets/eae441de-e66c-40aa-af63-97519b1866ab"
/>|
<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
kubaflo pushed a commit that referenced this pull request Jul 15, 2026
#36442)

<!-- Please keep the note below for people who find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment whether this change resolves your
issue. Thank you!<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!! -->

This pull request addresses the handling of stroke line caps for borders
on Windows and updates related tests. The main focus is to ensure that
`StrokeDashCap` is set correctly along with `StrokeStartLineCap` and
`StrokeEndLineCap`, and to enable previously disabled tests now that the
related issues are resolved.

### Description of Change

**Platform rendering improvements:**

* Updated `UpdateStrokeLineCap` in `BorderExtensions.cs` to set
`StrokeDashCap` in addition to `StrokeStartLineCap` and
`StrokeEndLineCap`, ensuring consistent rendering of dashed borders on
Windows.

**Test updates:**

* Re-enabled previously disabled border stroke dash array tests for
Windows in `BorderFeatureTests.cs`, allowing them to run on all
platforms now that the underlying issues are fixed.
[[1]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L502)
[[2]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L631)


<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #29741 

### Tested the behavior in the following platforms

- [x] Windows
- [ ] Android
- [ ] iOS
- [ ] Mac


### Snapshots :

 | Before Fix | After Fix |
 |--------------------------|---------------------------|
| <img width="1429" height="876" alt="BeforeFix29741"
src="https://github.com/user-attachments/assets/34a7b94e-8da0-4aba-97ea-d38d32558656"
/> | <img width="1285" height="1016" alt="AfterFix29471"
src="https://github.com/user-attachments/assets/eae441de-e66c-40aa-af63-97519b1866ab"
/>|
<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
kubaflo pushed a commit that referenced this pull request Jul 22, 2026
#36442)

<!-- Please keep the note below for people who find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment whether this change resolves your
issue. Thank you!<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!! -->

This pull request addresses the handling of stroke line caps for borders
on Windows and updates related tests. The main focus is to ensure that
`StrokeDashCap` is set correctly along with `StrokeStartLineCap` and
`StrokeEndLineCap`, and to enable previously disabled tests now that the
related issues are resolved.

### Description of Change

**Platform rendering improvements:**

* Updated `UpdateStrokeLineCap` in `BorderExtensions.cs` to set
`StrokeDashCap` in addition to `StrokeStartLineCap` and
`StrokeEndLineCap`, ensuring consistent rendering of dashed borders on
Windows.

**Test updates:**

* Re-enabled previously disabled border stroke dash array tests for
Windows in `BorderFeatureTests.cs`, allowing them to run on all
platforms now that the underlying issues are fixed.
[[1]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L502)
[[2]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L631)


<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #29741 

### Tested the behavior in the following platforms

- [x] Windows
- [ ] Android
- [ ] iOS
- [ ] Mac


### Snapshots :

 | Before Fix | After Fix |
 |--------------------------|---------------------------|
| <img width="1429" height="876" alt="BeforeFix29741"
src="https://github.com/user-attachments/assets/34a7b94e-8da0-4aba-97ea-d38d32558656"
/> | <img width="1285" height="1016" alt="AfterFix29471"
src="https://github.com/user-attachments/assets/eae441de-e66c-40aa-af63-97519b1866ab"
/>|
<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
kubaflo pushed a commit that referenced this pull request Jul 28, 2026
#36442)

<!-- Please keep the note below for people who find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment whether this change resolves your
issue. Thank you!<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!! -->

This pull request addresses the handling of stroke line caps for borders
on Windows and updates related tests. The main focus is to ensure that
`StrokeDashCap` is set correctly along with `StrokeStartLineCap` and
`StrokeEndLineCap`, and to enable previously disabled tests now that the
related issues are resolved.

### Description of Change

**Platform rendering improvements:**

* Updated `UpdateStrokeLineCap` in `BorderExtensions.cs` to set
`StrokeDashCap` in addition to `StrokeStartLineCap` and
`StrokeEndLineCap`, ensuring consistent rendering of dashed borders on
Windows.

**Test updates:**

* Re-enabled previously disabled border stroke dash array tests for
Windows in `BorderFeatureTests.cs`, allowing them to run on all
platforms now that the underlying issues are fixed.
[[1]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L502)
[[2]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L631)


<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #29741 

### Tested the behavior in the following platforms

- [x] Windows
- [ ] Android
- [ ] iOS
- [ ] Mac


### Snapshots :

 | Before Fix | After Fix |
 |--------------------------|---------------------------|
| <img width="1429" height="876" alt="BeforeFix29741"
src="https://github.com/user-attachments/assets/34a7b94e-8da0-4aba-97ea-d38d32558656"
/> | <img width="1285" height="1016" alt="AfterFix29471"
src="https://github.com/user-attachments/assets/eae441de-e66c-40aa-af63-97519b1866ab"
/>|
<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
kubaflo pushed a commit that referenced this pull request Jul 29, 2026
#36442)

<!-- Please keep the note below for people who find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment whether this change resolves your
issue. Thank you!<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!! -->

This pull request addresses the handling of stroke line caps for borders
on Windows and updates related tests. The main focus is to ensure that
`StrokeDashCap` is set correctly along with `StrokeStartLineCap` and
`StrokeEndLineCap`, and to enable previously disabled tests now that the
related issues are resolved.

### Description of Change

**Platform rendering improvements:**

* Updated `UpdateStrokeLineCap` in `BorderExtensions.cs` to set
`StrokeDashCap` in addition to `StrokeStartLineCap` and
`StrokeEndLineCap`, ensuring consistent rendering of dashed borders on
Windows.

**Test updates:**

* Re-enabled previously disabled border stroke dash array tests for
Windows in `BorderFeatureTests.cs`, allowing them to run on all
platforms now that the underlying issues are fixed.
[[1]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L502)
[[2]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L631)


<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #29741 

### Tested the behavior in the following platforms

- [x] Windows
- [ ] Android
- [ ] iOS
- [ ] Mac


### Snapshots :

 | Before Fix | After Fix |
 |--------------------------|---------------------------|
| <img width="1429" height="876" alt="BeforeFix29741"
src="https://github.com/user-attachments/assets/34a7b94e-8da0-4aba-97ea-d38d32558656"
/> | <img width="1285" height="1016" alt="AfterFix29471"
src="https://github.com/user-attachments/assets/eae441de-e66c-40aa-af63-97519b1866ab"
/>|
<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
kubaflo pushed a commit that referenced this pull request Aug 7, 2026
#36442)

<!-- Please keep the note below for people who find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment whether this change resolves your
issue. Thank you!<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!! -->

This pull request addresses the handling of stroke line caps for borders
on Windows and updates related tests. The main focus is to ensure that
`StrokeDashCap` is set correctly along with `StrokeStartLineCap` and
`StrokeEndLineCap`, and to enable previously disabled tests now that the
related issues are resolved.

### Description of Change

**Platform rendering improvements:**

* Updated `UpdateStrokeLineCap` in `BorderExtensions.cs` to set
`StrokeDashCap` in addition to `StrokeStartLineCap` and
`StrokeEndLineCap`, ensuring consistent rendering of dashed borders on
Windows.

**Test updates:**

* Re-enabled previously disabled border stroke dash array tests for
Windows in `BorderFeatureTests.cs`, allowing them to run on all
platforms now that the underlying issues are fixed.
[[1]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L502)
[[2]](diffhunk://#diff-a65f4bf692bd3303cdf056e3471f1280afb39d184f4e32769a8698f2a35db0a7L631)


<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #29741 

### Tested the behavior in the following platforms

- [x] Windows
- [ ] Android
- [ ] iOS
- [ ] Mac


### Snapshots :

 | Before Fix | After Fix |
 |--------------------------|---------------------------|
| <img width="1429" height="876" alt="BeforeFix29741"
src="https://github.com/user-attachments/assets/34a7b94e-8da0-4aba-97ea-d38d32558656"
/> | <img width="1285" height="1016" alt="AfterFix29471"
src="https://github.com/user-attachments/assets/eae441de-e66c-40aa-af63-97519b1866ab"
/>|
<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 9, 2026
@github-actions github-actions Bot modified the milestones: .NET 10 SR9, .NET 10 SR11 Sep 22, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-controls-border Border community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration platform/windows s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-gate-failed AI could not verify tests catch the bug 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.

StrokeLineCap values have no effect on Windows platform

6 participants