From 7c847ee0d104205d315e46dd52dc2e14cf5d452d Mon Sep 17 00:00:00 2001 From: "Simon Zhao (BEYONDSOFT CONSULTING INC)" Date: Tue, 25 Aug 2026 10:59:51 +0800 Subject: [PATCH 1/4] Fix issue 14778: Controls inside GroupBox no longer reflect inherited ForeColor/BackColor updates in VisualStylesMode.Net11 --- .../ButtonInternal/CheckBoxModernAdapter.cs | 4 +-- .../DarkMode/ButtonDarkModeAdapter.cs | 10 +++--- .../RadioButtonModernAdapter.cs | 4 +-- .../Button/AnimatedPopupButtonRenderer.cs | 12 +++---- .../Windows/Forms/ButtonVisualStylesTests.cs | 30 ++++++++++++++++-- .../Forms/PopupButtonVisualStylesTests.cs | 31 +++++++++++++++++++ 6 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs index 920d8553c6f..fe82b157881 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Drawing; @@ -112,7 +112,7 @@ private void PaintCore(PaintEventArgs e) PaintImage(e, layout); - Color preferredTextColor = Control.ShouldSerializeForeColor() + Color preferredTextColor = Control.ForeColor != Forms.Control.DefaultForeColor ? Control.ForeColor : Application.IsDarkModeEnabled ? Color.FromArgb(0xF0, 0xF0, 0xF0) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs index d02787f52cd..aebe2b4b39b 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs @@ -54,9 +54,7 @@ private Color GetButtonTextColor( backColor); } - bool useEffectiveForeColor = _modern - ? Control.ShouldSerializeForeColor() - : Control.ForeColor != Forms.Control.DefaultForeColor; + bool useEffectiveForeColor = Control.ForeColor != Forms.Control.DefaultForeColor; if (useEffectiveForeColor) { @@ -85,7 +83,11 @@ private Color GetButtonBackColor(PushButtonState state) { Color backColor; - if (Control.BackColor != Forms.Control.DefaultBackColor) + bool hasCustomBackColor = _modern + ? Control.ShouldSerializeBackColor() + : Control.BackColor != Forms.Control.DefaultBackColor; + + if (hasCustomBackColor) { backColor = ButtonDarkModeRenderer.GetBackgroundColor( state, diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs index ebf45535516..bf61f5ab428 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Drawing; @@ -111,7 +111,7 @@ private void PaintCore(PaintEventArgs e) PaintImage(e, layout); - Color preferredTextColor = Control.ShouldSerializeForeColor() + Color preferredTextColor = Control.ForeColor != Forms.Control.DefaultForeColor ? Control.ForeColor : Application.IsDarkModeEnabled ? Color.FromArgb(0xF0, 0xF0, 0xF0) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs b/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs index 5a3967073c4..613f344d703 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs @@ -138,9 +138,7 @@ public override void RenderControl(Graphics graphics) faceColor = PopupButtonColorMath.Blend(baseColor, hoverColor, _hoverCurrent); faceColor = PopupButtonColorMath.Blend(faceColor, pressedColor, _pressCurrent); - bool useAutomaticForeColor = button.EffectiveVisualStylesModeInternal >= VisualStylesMode.Net11 - ? !button.ShouldSerializeForeColor() - : button.ForeColor == Forms.Control.DefaultForeColor; + bool useAutomaticForeColor = button.ForeColor == Forms.Control.DefaultForeColor; foreColor = !useAutomaticForeColor ? button.ForeColor : _baseColorRenderer.GetTextColor(state, button.IsDefault, faceColor); @@ -157,9 +155,7 @@ public override void RenderControl(Graphics graphics) BackColor = faceColor, ForeColor = foreColor, SurfaceColor = button.Parent?.BackColor ?? button.BackColor, - UseAutomaticForeColor = button.EffectiveVisualStylesModeInternal >= VisualStylesMode.Net11 - ? !button.ShouldSerializeForeColor() - : button.ForeColor == Forms.Control.DefaultForeColor, + UseAutomaticForeColor = button.ForeColor == Forms.Control.DefaultForeColor, BorderColor = borderColor, BorderWidth = flatAppearance.BorderSize, Enabled = button.Enabled, @@ -238,7 +234,9 @@ public override void RenderControl(Graphics graphics) _baseColorRenderer.DeviceDpi = button.DeviceDpi; _baseColorRenderer.FlatAppearance = flatAppearance; - bool hasCustomBackColor = button.BackColor != Forms.Control.DefaultBackColor; + bool hasCustomBackColor = button.EffectiveVisualStylesModeInternal >= VisualStylesMode.Net11 + ? button.ShouldSerializeBackColor() + : button.BackColor != Forms.Control.DefaultBackColor; Color baseColor = hasCustomBackColor ? button.BackColor : _baseColorRenderer.GetBackgroundColor(PushButtonState.Normal, isDefault: false); diff --git a/src/test/unit/System.Windows.Forms/System/Windows/Forms/ButtonVisualStylesTests.cs b/src/test/unit/System.Windows.Forms/System/Windows/Forms/ButtonVisualStylesTests.cs index d4d2d67d00d..c0b515295a3 100644 --- a/src/test/unit/System.Windows.Forms/System/Windows/Forms/ButtonVisualStylesTests.cs +++ b/src/test/unit/System.Windows.Forms/System/Windows/Forms/ButtonVisualStylesTests.cs @@ -658,6 +658,32 @@ public void ButtonDarkModeAdapter_InteractionPaintStateStartsColorAnimation() Assert.True(animator.IsRunning); } + [WinFormsFact] + public void ButtonDarkModeAdapter_InheritedBackColor_UsesThemeStateColorInNet11() + { + using Panel parent = new() { BackColor = Color.Red }; + using Button button = new() + { + FlatStyle = FlatStyle.Standard, + VisualStylesMode = VisualStylesMode.Net11 + }; + parent.Controls.Add(button); + ButtonInternal.ButtonDarkModeAdapter adapter = new(button); + dynamic accessor = adapter.TestAccessor.Dynamic; + ModernButtonDarkModeRenderer neutralRenderer = new() + { + DeviceDpi = button.DeviceDpi, + FlatAppearance = button.FlatAppearance + }; + + Color actual = (Color)accessor.GetButtonBackColor(VisualStyles.PushButtonState.Normal); + + Assert.Equal( + neutralRenderer.GetBackgroundColor(VisualStyles.PushButtonState.Normal, isDefault: false), + actual); + Assert.False(button.ShouldSerializeBackColor()); + } + public static TheoryData ModernImageLayoutData { get @@ -1120,7 +1146,7 @@ public void ButtonDarkModeAdapter_ExplicitForeColor_IsPreserved() } [WinFormsFact] - public void ButtonDarkModeAdapter_InheritedForeColor_UsesAutomaticContrast() + public void ButtonDarkModeAdapter_InheritedForeColor_IsPreservedInNet11() { using Panel parent = new() { ForeColor = Color.Red }; using Button button = new() @@ -1139,7 +1165,7 @@ public void ButtonDarkModeAdapter_InheritedForeColor_UsesAutomaticContrast() VisualStyles.PushButtonState.Normal, Color.White); - Assert.Equal(Color.Black, actual); + Assert.Equal(Color.Red, actual); Assert.False(button.ShouldSerializeForeColor()); } diff --git a/src/test/unit/System.Windows.Forms/System/Windows/Forms/PopupButtonVisualStylesTests.cs b/src/test/unit/System.Windows.Forms/System/Windows/Forms/PopupButtonVisualStylesTests.cs index d12e609f5c0..fb76d383343 100644 --- a/src/test/unit/System.Windows.Forms/System/Windows/Forms/PopupButtonVisualStylesTests.cs +++ b/src/test/unit/System.Windows.Forms/System/Windows/Forms/PopupButtonVisualStylesTests.cs @@ -203,6 +203,37 @@ public void AnimatedPopupButtonRenderer_CustomBackColor_DerivesNeutralStateColor Assert.Equal(PopupButtonColorMath.TowardsContrast(button.BackColor, 0.12f), pressedColor); } + [WinFormsFact] + public void AnimatedPopupButtonRenderer_InheritedBackColor_UsesThemeStateColorsInNet11() + { + using Panel parent = new() { BackColor = Color.Red }; + using Button button = new() + { + FlatStyle = FlatStyle.Popup, + VisualStylesMode = VisualStylesMode.Net11 + }; + parent.Controls.Add(button); + using AnimatedPopupButtonRenderer renderer = new(button); + ModernButtonDarkModeRenderer neutralRenderer = new() + { + DeviceDpi = button.DeviceDpi, + FlatAppearance = button.FlatAppearance + }; + + (Color baseColor, Color hoverColor, Color pressedColor) = renderer.GetStateColors(); + + Assert.Equal( + neutralRenderer.GetBackgroundColor(VisualStyles.PushButtonState.Normal, isDefault: false), + baseColor); + Assert.Equal( + neutralRenderer.GetBackgroundColor(VisualStyles.PushButtonState.Hot, isDefault: false), + hoverColor); + Assert.Equal( + neutralRenderer.GetBackgroundColor(VisualStyles.PushButtonState.Pressed, isDefault: false), + pressedColor); + Assert.False(button.ShouldSerializeBackColor()); + } + [WinFormsFact] public void PopupButtonKeyCapRenderer_FocusedDefault_RendersWithoutThrow() { From 399d150ef8dafafc631c5cca14b18407524b9b18 Mon Sep 17 00:00:00 2001 From: "Simon Zhao (BEYONDSOFT CONSULTING INC)" Date: Thu, 27 Aug 2026 14:05:01 +0800 Subject: [PATCH 2/4] Handle copilot feedback --- .../Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs | 4 +++- .../Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs index aebe2b4b39b..c59dca9d3d3 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs @@ -54,7 +54,9 @@ private Color GetButtonTextColor( backColor); } - bool useEffectiveForeColor = Control.ForeColor != Forms.Control.DefaultForeColor; + bool useEffectiveForeColor = _modern + ? Control.ShouldSerializeForeColor() || Control.ForeColor != Forms.Control.DefaultForeColor + : Control.ForeColor != Forms.Control.DefaultForeColor; if (useEffectiveForeColor) { diff --git a/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs b/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs index 613f344d703..1efc0d76866 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Drawing; @@ -138,7 +138,8 @@ public override void RenderControl(Graphics graphics) faceColor = PopupButtonColorMath.Blend(baseColor, hoverColor, _hoverCurrent); faceColor = PopupButtonColorMath.Blend(faceColor, pressedColor, _pressCurrent); - bool useAutomaticForeColor = button.ForeColor == Forms.Control.DefaultForeColor; + bool useAutomaticForeColor = button.ForeColor == Forms.Control.DefaultForeColor + && !button.ShouldSerializeForeColor(); foreColor = !useAutomaticForeColor ? button.ForeColor : _baseColorRenderer.GetTextColor(state, button.IsDefault, faceColor); From e4307971b7eb0da09d58e9816ac2fe8d404c68db Mon Sep 17 00:00:00 2001 From: "Simon Zhao (BEYONDSOFT CONSULTING INC)" Date: Tue, 1 Sep 2026 09:00:26 +0800 Subject: [PATCH 3/4] Handle feedback --- .../Buttons/ButtonInternal/CheckBoxModernAdapter.cs | 2 +- .../ButtonInternal/RadioButtonModernAdapter.cs | 2 +- .../Rendering/Button/AnimatedPopupButtonRenderer.cs | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs index fe82b157881..81e04768007 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs @@ -112,7 +112,7 @@ private void PaintCore(PaintEventArgs e) PaintImage(e, layout); - Color preferredTextColor = Control.ForeColor != Forms.Control.DefaultForeColor + Color preferredTextColor = Control.ShouldSerializeForeColor() || Control.ForeColor != Forms.Control.DefaultForeColor ? Control.ForeColor : Application.IsDarkModeEnabled ? Color.FromArgb(0xF0, 0xF0, 0xF0) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs index bf61f5ab428..322dd562ac1 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs @@ -111,7 +111,7 @@ private void PaintCore(PaintEventArgs e) PaintImage(e, layout); - Color preferredTextColor = Control.ForeColor != Forms.Control.DefaultForeColor + Color preferredTextColor = Control.ShouldSerializeForeColor() || Control.ForeColor != Forms.Control.DefaultForeColor ? Control.ForeColor : Application.IsDarkModeEnabled ? Color.FromArgb(0xF0, 0xF0, 0xF0) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs b/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs index 1efc0d76866..065c2bdb753 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Rendering/Button/AnimatedPopupButtonRenderer.cs @@ -9,7 +9,7 @@ namespace System.Windows.Forms.Rendering.Button; /// -/// Drives and renders a whose is +/// Drives and renders a whose is /// when modern visual styles or dark mode are active, using the concave key-cap /// look of . /// @@ -119,6 +119,7 @@ public override void RenderControl(Graphics graphics) Color faceColor; Color foreColor; Color borderColor; + bool useAutomaticForeColor = false; if (highContrast) { @@ -138,8 +139,8 @@ public override void RenderControl(Graphics graphics) faceColor = PopupButtonColorMath.Blend(baseColor, hoverColor, _hoverCurrent); faceColor = PopupButtonColorMath.Blend(faceColor, pressedColor, _pressCurrent); - bool useAutomaticForeColor = button.ForeColor == Forms.Control.DefaultForeColor - && !button.ShouldSerializeForeColor(); + useAutomaticForeColor = button.ForeColor == Control.DefaultForeColor + && !button.ShouldSerializeForeColor(); foreColor = !useAutomaticForeColor ? button.ForeColor : _baseColorRenderer.GetTextColor(state, button.IsDefault, faceColor); @@ -156,7 +157,7 @@ public override void RenderControl(Graphics graphics) BackColor = faceColor, ForeColor = foreColor, SurfaceColor = button.Parent?.BackColor ?? button.BackColor, - UseAutomaticForeColor = button.ForeColor == Forms.Control.DefaultForeColor, + UseAutomaticForeColor = useAutomaticForeColor, BorderColor = borderColor, BorderWidth = flatAppearance.BorderSize, Enabled = button.Enabled, @@ -230,14 +231,14 @@ public override void RenderControl(Graphics graphics) internal (Color BaseColor, Color HoverColor, Color PressedColor) GetStateColors() { - Forms.ButtonBase button = Button; + ButtonBase button = Button; FlatButtonAppearance flatAppearance = button.FlatAppearance; _baseColorRenderer.DeviceDpi = button.DeviceDpi; _baseColorRenderer.FlatAppearance = flatAppearance; bool hasCustomBackColor = button.EffectiveVisualStylesModeInternal >= VisualStylesMode.Net11 ? button.ShouldSerializeBackColor() - : button.BackColor != Forms.Control.DefaultBackColor; + : button.BackColor != Control.DefaultBackColor; Color baseColor = hasCustomBackColor ? button.BackColor : _baseColorRenderer.GetBackgroundColor(PushButtonState.Normal, isDefault: false); From 4f9cc48968e0b28966fa9cb1757d9040562b92f8 Mon Sep 17 00:00:00 2001 From: "Simon Zhao (BEYONDSOFT CONSULTING INC)" Date: Fri, 4 Sep 2026 15:42:11 +0800 Subject: [PATCH 4/4] Handle conflicts --- .../Buttons/ButtonInternal/CheckBoxModernAdapter.cs | 2 +- .../ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs | 12 ++++++------ .../ButtonInternal/RadioButtonModernAdapter.cs | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs index 2bb09bd8620..749eda02a6a 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/CheckBoxModernAdapter.cs @@ -127,7 +127,7 @@ private void PaintCore(PaintEventArgs e) Color preferredTextColor = Control.ShouldSerializeForeColor() || Control.ForeColor != Forms.Control.DefaultForeColor ? Control.ForeColor : Application.IsDarkModeEnabled - ? Color.FromArgb(0xF0, 0xF0, 0xF0) + ? DarkModeButtonColors.DefaultColors.AcceptButtonTextColor // Use the default accept button text color in dark mode for checkboxes. : SystemColors.WindowText; Color disabledTextBackColor = Control.ShouldSerializeBackColor() && Control.BackColor.A == byte.MaxValue diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs index ad0c11bd656..c274360bf13 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/DarkMode/ButtonDarkModeAdapter.cs @@ -55,8 +55,8 @@ private Color GetButtonTextColor( } bool useEffectiveForeColor = _modern - ? Control.ShouldSerializeForeColor() || Control.ForeColor != Forms.Control.DefaultForeColor - : Control.ForeColor != Forms.Control.DefaultForeColor; + ? Control.ShouldSerializeForeColor() || Control.ForeColor != Forms.Control.DefaultForeColor + : Control.ForeColor != Forms.Control.DefaultForeColor; if (useEffectiveForeColor) { @@ -95,11 +95,11 @@ private Color GetButtonBackColor(PushButtonState state) } else { - bool hasExplicitBackColor = Control.ShouldSerializeBackColor(); - bool hasUsableAmbientBackColor = !Control.BackColor.HasTransparency() - && Control.BackColor != Forms.Control.DefaultBackColor; + bool hasCustomBackColor = _modern + ? Control.ShouldSerializeBackColor() + : Control.BackColor != Forms.Control.DefaultBackColor; - if (hasExplicitBackColor || hasUsableAmbientBackColor) + if (hasCustomBackColor) { backColor = ButtonDarkModeRenderer.GetBackgroundColor( state, diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs index 8a2731fc207..2d0aad26122 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Buttons/ButtonInternal/RadioButtonModernAdapter.cs @@ -127,7 +127,7 @@ private void PaintCore(PaintEventArgs e) Color preferredTextColor = Control.ShouldSerializeForeColor() || Control.ForeColor != Forms.Control.DefaultForeColor ? Control.ForeColor : Application.IsDarkModeEnabled - ? Color.FromArgb(0xF0, 0xF0, 0xF0) + ? DarkModeButtonColors.DefaultColors.AcceptButtonTextColor // Use the default accept button text color in dark mode for radio buttons. : SystemColors.WindowText; Color disabledTextBackColor = Control.ShouldSerializeBackColor() && Control.BackColor.A == byte.MaxValue