From f7e0624ee74c099b3162970c9f5751badd62ce5f Mon Sep 17 00:00:00 2001 From: "Leaf Shi (BEYONDSOFT CONSULTING INC)" Date: Wed, 5 Aug 2026 19:32:56 -0700 Subject: [PATCH 1/3] Fix editable control border color in NET11 visual styles- #14853 --- .../Forms/Controls/ComboBox/ComboBox.ModernComboAdapter.cs | 2 +- .../System/Windows/Forms/Controls/TextBox/TextBoxBase.cs | 3 +-- .../System/Windows/Forms/Controls/UpDown/UpDownBase.cs | 3 +-- .../System/Windows/Forms/Rendering/ModernControlColorMath.cs | 2 ++ 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/ComboBox/ComboBox.ModernComboAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/ComboBox/ComboBox.ModernComboAdapter.cs index 2623d41f726..7f2a1c94589 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/ComboBox/ComboBox.ModernComboAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/ComboBox/ComboBox.ModernComboAdapter.cs @@ -418,7 +418,7 @@ private static Color GetBorderColor(ComboBox comboBox, bool useAccent) return useAccent ? Application.SystemVisualSettings.AccentColor - : comboBox.ForeColor; + : ModernControlColorMath.TextControlBorderColor; } private static int GetBorderThickness(ComboBox comboBox) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/TextBox/TextBoxBase.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/TextBox/TextBoxBase.cs index 021b73554da..56a5bff86e2 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/TextBox/TextBoxBase.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/TextBox/TextBoxBase.cs @@ -2663,10 +2663,9 @@ private protected virtual void OnNcPaint(Graphics graphics, HDC windowHdc) int borderThickness = Math.Max(focusBorderMetrics.Width, focusBorderMetrics.Height); int focusBandHeight = GetVisualStylesFocusBandHeight(); - Color adornerColor = ForeColor; - Color clientBackColor = BackColor; Color parentBackColor = Parent?.BackColor ?? BackColor; + Color adornerColor = ModernControlColorMath.TextControlBorderColor; using var clientBackgroundBrush = clientBackColor.GetCachedSolidBrushScope(); using var adornerBrush = adornerColor.GetCachedSolidBrushScope(); diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/UpDown/UpDownBase.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/UpDown/UpDownBase.cs index c7ed217446c..9d76b4c3771 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/UpDown/UpDownBase.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/UpDown/UpDownBase.cs @@ -1084,10 +1084,9 @@ private void DrawModernBorder(PaintEventArgs e) int cornerRadius = LogicalToDeviceUnits(ModernControlVisualStyles.UpDownCornerRadius); int borderThickness = LogicalToDeviceUnits(ModernControlVisualStyles.BorderThickness); - // The adorner (border) color matches the modern TextBox chrome, which uses the fore color. - Color adornerColor = ForeColor; Color parentBackColor = Parent?.BackColor ?? BackColor; Color clientBackColor = BackColor; + Color adornerColor = ModernControlColorMath.TextControlBorderColor; using var clientBackgroundBrush = clientBackColor.GetCachedSolidBrushScope(); using var adornerPen = adornerColor.GetCachedPenScope(borderThickness); diff --git a/src/System.Windows.Forms/System/Windows/Forms/Rendering/ModernControlColorMath.cs b/src/System.Windows.Forms/System/Windows/Forms/Rendering/ModernControlColorMath.cs index 78832f78731..73deb2f9a1d 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Rendering/ModernControlColorMath.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Rendering/ModernControlColorMath.cs @@ -27,6 +27,8 @@ internal static class ModernControlColorMath private static readonly Color s_darkModeDisabledForeground = Color.FromArgb(0x88, 0x88, 0x88); private static readonly Color s_lightModeDisabledForeground = Color.FromArgb(0xA0, 0xA0, 0xA0); + internal static Color TextControlBorderColor => SystemColors.ControlDarkDark; + /// /// Gets the surface color for a disabled modern control, honoring the current color mode /// and high contrast settings. From b6302452b37fa26ecf0ba284f7dec116422ef507 Mon Sep 17 00:00:00 2001 From: "Leaf Shi (BEYONDSOFT CONSULTING INC)" Date: Wed, 5 Aug 2026 22:59:40 -0700 Subject: [PATCH 2/3] Update test cases --- .../System/Windows/Forms/ComboBoxTests.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/test/unit/System.Windows.Forms/System/Windows/Forms/ComboBoxTests.cs b/src/test/unit/System.Windows.Forms/System/Windows/Forms/ComboBoxTests.cs index 2af7ac2f04d..856410005c2 100644 --- a/src/test/unit/System.Windows.Forms/System/Windows/Forms/ComboBoxTests.cs +++ b/src/test/unit/System.Windows.Forms/System/Windows/Forms/ComboBoxTests.cs @@ -503,7 +503,7 @@ public void ComboBox_ModernVisualStyles_FramesUseExpectedGeometryAndColor( Color expectedBorder = usesAccent ? Application.SystemVisualSettings.AccentColor - : control.ForeColor; + : ModernControlColorMath.TextControlBorderColor; Assert.True( CountPixels( actual, @@ -642,13 +642,9 @@ public void ComboBox_ModernVisualStyles_Disabled_UsesDisabledBorderAndButtonColo if (flatStyle != FlatStyle.Popup) { - // Standard and Flat use the ForeColor for the border; it must be absent when disabled. Assert.True( - CountPixels(enabledBitmap, customForeColor, channelTolerance: 16) > 0, - "Enabled ComboBox should render border with ForeColor."); - Assert.True( - CountPixels(disabledBitmap, customForeColor, channelTolerance: 16) == 0, - "Disabled ComboBox must not render border with the ForeColor."); + CountPixels(enabledBitmap, ModernControlColorMath.TextControlBorderColor, channelTolerance: 16) > 0, + "Enabled ComboBox should render border with TextControlBorderColor."); Assert.True( CountPixels( disabledBitmap, From 97986b438ee4ce32e28fd0124b64eec9bf483721 Mon Sep 17 00:00:00 2001 From: "Leaf Shi (BEYONDSOFT CONSULTING INC)" Date: Thu, 6 Aug 2026 00:35:50 -0700 Subject: [PATCH 3/3] To ensure sufficient contrast between the border and the background, the border color is set separately for dark mode and light mode. --- .../System/Windows/Forms/Rendering/ModernControlColorMath.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Rendering/ModernControlColorMath.cs b/src/System.Windows.Forms/System/Windows/Forms/Rendering/ModernControlColorMath.cs index 73deb2f9a1d..68013a2b8da 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Rendering/ModernControlColorMath.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Rendering/ModernControlColorMath.cs @@ -27,7 +27,10 @@ internal static class ModernControlColorMath private static readonly Color s_darkModeDisabledForeground = Color.FromArgb(0x88, 0x88, 0x88); private static readonly Color s_lightModeDisabledForeground = Color.FromArgb(0xA0, 0xA0, 0xA0); - internal static Color TextControlBorderColor => SystemColors.ControlDarkDark; + internal static Color TextControlBorderColor + => Application.IsDarkModeEnabled + ? SystemColors.WindowText + : SystemColors.WindowFrame; /// /// Gets the surface color for a disabled modern control, honoring the current color mode