[Windows] Fix: StrokeLineCap values have no effect on Windows platform - #36442
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 36442Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 36442" |
|
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. |
|
/azp run |
|
Azure Pipelines successfully started running 3 pipeline(s). |
There was a problem hiding this comment.
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.UpdateStrokeLineCapto also setStrokeDashCap. - 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. |
This comment has been minimized.
This comment has been minimized.
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
|
/azp run maui-pr-uitests |
|
Azure Pipelines successfully started running 1 pipeline(s). |
This comment has been minimized.
This comment has been minimized.
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
| } | ||
|
|
||
| // ── DashArray + StrokeLineCap tests disabled for Windows (Order 19–24) ── | ||
| // ── DashArray + StrokeLineCap tests (Order 26–31) ── |
There was a problem hiding this comment.
🔍 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
left a comment
There was a problem hiding this comment.
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.
🗂️ 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
StrokeLineCapvisually affects Android, iOS, and macOS but has no visible impact on Windows; it was verified reproducible on Windows. - PR implementation sets WinUI
Path.StrokeDashCapalong with start/end caps inBorderExtensions.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
BorderFeatureTestspassed 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
ghis 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
UpdateStrokeLineCapis invoked; harmless for non-dashed strokes. - Startup impact: No.
- Static/shared state: No.
CI Status
- Required-check result:
gh pr checks --requiredunavailable 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,
Failure-Mode Probing
- Non-dashed borders: setting
StrokeDashCapis benign; it only affects dashed strokes. - Null/default values: existing null guards remain unchanged.
- Handler reconnect/new path:
WrapperView.UpdateBorderreapplies 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 onlyStrokeStartLineCap/StrokeEndLineCap. - The gate failure is about regression proof, not product-code failure:
BorderFeatureTestspassed 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-1independently reached the same important testing insight, but its product approach spreads synchronization across multiple call sites.pr-plus-reviewercaptures the useful test improvement while preserving the simpler PR implementation.try-fix-2is lowest because it introduces a new WindowsPathsubtype 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.
#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. -->
#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. -->
#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. -->
#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. -->
#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. -->
#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. -->
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
StrokeDashCapis set correctly along withStrokeStartLineCapandStrokeEndLineCap, and to enable previously disabled tests now that the related issues are resolved.Description of Change
Platform rendering improvements:
UpdateStrokeLineCapinBorderExtensions.csto setStrokeDashCapin addition toStrokeStartLineCapandStrokeEndLineCap, ensuring consistent rendering of dashed borders on Windows.Test updates:
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
Snapshots :