From b46532818eacf4a63bad87f97daec96b021f37ba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Jun 2025 05:57:27 +0000 Subject: [PATCH 1/2] Initial plan for issue From 81c02e388a88a6130cf4f26eef06f45e4c03d897 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Jun 2025 06:05:38 +0000 Subject: [PATCH 2/2] Fix SegmentBackground not being drawn when StrokeThickness is 0 Co-authored-by: PaulAndersonS <42271912+PaulAndersonS@users.noreply.github.com> --- .../SegmentedControl/Views/SegmentItemView.cs | 25 +++++++++++++------ .../Buttons/SfSegmentedControlUnitTests.cs | 22 ++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/maui/src/SegmentedControl/Views/SegmentItemView.cs b/maui/src/SegmentedControl/Views/SegmentItemView.cs index 4b99b57..2647637 100644 --- a/maui/src/SegmentedControl/Views/SegmentItemView.cs +++ b/maui/src/SegmentedControl/Views/SegmentItemView.cs @@ -237,7 +237,7 @@ void OnSemanticsNodeClick(SemanticsNode node) /// The area that needs to be redrawn. void DrawRoundedRectangle(ICanvas canvas, RectF dirtyRect) { - if (itemInfo?.SegmentTemplate != null || itemInfo == null || itemInfo.StrokeThickness == 0) + if (itemInfo?.SegmentTemplate != null || itemInfo == null) { return; } @@ -245,19 +245,28 @@ void DrawRoundedRectangle(ICanvas canvas, RectF dirtyRect) canvas.CanvasSaveState(); canvas.Antialias = true; float strokeRadius = (float)itemInfo.StrokeThickness / 2f; - canvas.StrokeSize = (float)itemInfo.StrokeThickness; - canvas.StrokeColor = SegmentViewHelper.BrushToColorConverter(itemInfo.Stroke); CornerRadius cornerRadius = itemInfo.SegmentCornerRadius; - // Subtracting stroke radius value to resolve the stroke thickness cropping issue. - float cornerRadiusTopLeft = (float)cornerRadius.TopLeft - strokeRadius; - float cornerRadiusTopRight = (float)cornerRadius.TopRight - strokeRadius; - float cornerRadiusBottomRight = (float)cornerRadius.BottomRight - strokeRadius; - float cornerRadiusBottomLeft = (float)cornerRadius.BottomLeft - strokeRadius; + // Calculate corner radius values, subtracting stroke radius when there's stroke thickness + float cornerRadiusTopLeft = itemInfo.StrokeThickness > 0 ? (float)cornerRadius.TopLeft - strokeRadius : (float)cornerRadius.TopLeft; + float cornerRadiusTopRight = itemInfo.StrokeThickness > 0 ? (float)cornerRadius.TopRight - strokeRadius : (float)cornerRadius.TopRight; + float cornerRadiusBottomRight = itemInfo.StrokeThickness > 0 ? (float)cornerRadius.BottomRight - strokeRadius : (float)cornerRadius.BottomRight; + float cornerRadiusBottomLeft = itemInfo.StrokeThickness > 0 ? (float)cornerRadius.BottomLeft - strokeRadius : (float)cornerRadius.BottomLeft; + + // Always draw the background bool isEnabled = SegmentViewHelper.GetItemEnabled(itemInfo, _segmentItem); Brush background = isEnabled ? SegmentViewHelper.GetSegmentBackground(itemInfo, _segmentItem) : itemInfo.DisabledSegmentBackground; canvas.FillColor = SegmentViewHelper.BrushToColorConverter(background); canvas.FillRoundedRectangle(dirtyRect.Left, dirtyRect.Top, dirtyRect.Width, dirtyRect.Height, cornerRadiusTopLeft, cornerRadiusTopRight, cornerRadiusBottomRight, cornerRadiusBottomLeft); + + // Only draw stroke if stroke thickness is greater than 0 + if (itemInfo.StrokeThickness > 0) + { + canvas.StrokeSize = (float)itemInfo.StrokeThickness; + canvas.StrokeColor = SegmentViewHelper.BrushToColorConverter(itemInfo.Stroke); + canvas.DrawRoundedRectangle(dirtyRect.Left, dirtyRect.Top, dirtyRect.Width, dirtyRect.Height, cornerRadiusTopLeft, cornerRadiusTopRight, cornerRadiusBottomRight, cornerRadiusBottomLeft); + } + canvas.CanvasRestoreState(); } diff --git a/maui/tests/Syncfusion.Maui.Toolkit.UnitTest/Buttons/SfSegmentedControlUnitTests.cs b/maui/tests/Syncfusion.Maui.Toolkit.UnitTest/Buttons/SfSegmentedControlUnitTests.cs index e750aa2..f3cd05f 100644 --- a/maui/tests/Syncfusion.Maui.Toolkit.UnitTest/Buttons/SfSegmentedControlUnitTests.cs +++ b/maui/tests/Syncfusion.Maui.Toolkit.UnitTest/Buttons/SfSegmentedControlUnitTests.cs @@ -219,6 +219,18 @@ public void SegmentBackground_SetValue_ReturnsExpectedValue(string colorHex) Assert.Equal(segmentBackground, segmentedControl.SegmentBackground); } + [Theory] + [InlineData("#FF0000")] + public void SegmentBackground_WithZeroStrokeThickness_ReturnsExpectedValue(string colorHex) + { + var segmentedControl = new SfSegmentedControl(); + Brush segmentBackground = new SolidColorBrush(Color.FromArgb(colorHex)); + segmentedControl.SegmentBackground = segmentBackground; + segmentedControl.StrokeThickness = 0; + Assert.Equal(segmentBackground, segmentedControl.SegmentBackground); + Assert.Equal(0, segmentedControl.StrokeThickness); + } + [Theory] [InlineData("#FF0000")] public void DisabledSegmentBackground_SetValue_ReturnsExpectedValue(string colorHex) @@ -1124,6 +1136,16 @@ public void GetSegmentBackground_ReturnsItemInfoSegmentBackground_WhenSegmentIte Assert.Equal(itemInfo.SegmentBackground, resultBackground); } + [Fact] + public void GetSegmentBackground_ReturnsItemInfoSegmentBackground_WhenStrokeThicknessIsZero() + { + var itemInfo = new SfSegmentedControl { SegmentBackground = Brush.Red, StrokeThickness = 0 }; + var segmentItem = new SfSegmentItem(); + var resultBackground = SegmentViewHelper.GetSegmentBackground(itemInfo, segmentItem); + Assert.Equal(itemInfo.SegmentBackground, resultBackground); + Assert.Equal(0, itemInfo.StrokeThickness); + } + [Fact] public void GetSegmentBackground_ReturnsTransparent_WhenBothSegmentItemAndItemInfoBackgroundsAreNull() {