From 17bb85ce40758d022ce7681d83092544ecbce968 Mon Sep 17 00:00:00 2001 From: v-leafshi Date: Tue, 10 Feb 2026 16:44:52 +0800 Subject: [PATCH 1/2] Fix LinkLabel contrast in Dark Mode --- .../Forms/Controls/Labels/LinkLabel.cs | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkLabel.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkLabel.cs index 15b9c32a018..7b7c114573a 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkLabel.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkLabel.cs @@ -69,7 +69,21 @@ public LinkLabel() : base() [SRDescription(nameof(SR.LinkLabelActiveLinkColorDescr))] public Color ActiveLinkColor { - get => _activeLinkColor.IsEmpty ? IEActiveLinkColor : _activeLinkColor; + get + { + if (!_activeLinkColor.IsEmpty) + { + return _activeLinkColor; + } + + if (Application.IsDarkModeEnabled) + { + // Use red color for active state in dark mode (similar to IE's hover color) + return Color.FromArgb(0xFF, 0x60, 0x60); + } + + return IEActiveLinkColor; + } set { if (_activeLinkColor != value) @@ -234,9 +248,26 @@ public LinkBehavior LinkBehavior [SRDescription(nameof(SR.LinkLabelLinkColorDescr))] public Color LinkColor { - get => _linkColor.IsEmpty - ? SystemInformation.HighContrast ? SystemColors.HotTrack : IELinkColor - : _linkColor; + get + { + if (!_linkColor.IsEmpty) + { + return _linkColor; + } + + if (SystemInformation.HighContrast) + { + return SystemColors.HotTrack; + } + + if (Application.IsDarkModeEnabled) + { + // Use a bright blue color that contrasts well with dark backgrounds + return Color.FromArgb(0x60, 0xA0, 0xE0); + } + + return IELinkColor; + } set { if (_linkColor != value) @@ -346,7 +377,9 @@ public override string Text public Color VisitedLinkColor { get => _visitedLinkColor.IsEmpty - ? SystemInformation.HighContrast ? LinkUtilities.GetVisitedLinkColor() : IEVisitedLinkColor + ? SystemInformation.HighContrast || Application.IsDarkModeEnabled + ? LinkUtilities.GetVisitedLinkColor() + : IEVisitedLinkColor : _visitedLinkColor; set { From d67d48a4851220fc97f122ecd4966005f9db99db Mon Sep 17 00:00:00 2001 From: v-leafshi Date: Wed, 11 Feb 2026 17:50:00 +0800 Subject: [PATCH 2/2] Defining different state color in LinkUtilities --- .../Forms/Controls/Labels/LinkLabel.cs | 57 ++++++------------- .../Forms/Controls/Labels/LinkUtilities.cs | 15 +++++ 2 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkLabel.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkLabel.cs index 7b7c114573a..cf93ba9c331 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkLabel.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkLabel.cs @@ -69,21 +69,11 @@ public LinkLabel() : base() [SRDescription(nameof(SR.LinkLabelActiveLinkColorDescr))] public Color ActiveLinkColor { - get - { - if (!_activeLinkColor.IsEmpty) - { - return _activeLinkColor; - } - - if (Application.IsDarkModeEnabled) - { - // Use red color for active state in dark mode (similar to IE's hover color) - return Color.FromArgb(0xFF, 0x60, 0x60); - } - - return IEActiveLinkColor; - } + get => !_activeLinkColor.IsEmpty + ? _activeLinkColor + : Application.IsDarkModeEnabled + ? LinkUtilities.DarkModeActiveLinkColor + : IEActiveLinkColor; set { if (_activeLinkColor != value) @@ -248,26 +238,13 @@ public LinkBehavior LinkBehavior [SRDescription(nameof(SR.LinkLabelLinkColorDescr))] public Color LinkColor { - get - { - if (!_linkColor.IsEmpty) - { - return _linkColor; - } - - if (SystemInformation.HighContrast) - { - return SystemColors.HotTrack; - } - - if (Application.IsDarkModeEnabled) - { - // Use a bright blue color that contrasts well with dark backgrounds - return Color.FromArgb(0x60, 0xA0, 0xE0); - } - - return IELinkColor; - } + get => !_linkColor.IsEmpty + ? _linkColor + : SystemInformation.HighContrast + ? SystemColors.HotTrack + : Application.IsDarkModeEnabled + ? LinkUtilities.DarkModeLinkColor + : IELinkColor; set { if (_linkColor != value) @@ -376,11 +353,13 @@ public override string Text [SRDescription(nameof(SR.LinkLabelVisitedLinkColorDescr))] public Color VisitedLinkColor { - get => _visitedLinkColor.IsEmpty - ? SystemInformation.HighContrast || Application.IsDarkModeEnabled + get => !_visitedLinkColor.IsEmpty + ? _visitedLinkColor + : SystemInformation.HighContrast ? LinkUtilities.GetVisitedLinkColor() - : IEVisitedLinkColor - : _visitedLinkColor; + : Application.IsDarkModeEnabled + ? LinkUtilities.DarkModeVisitedLinkColor + : IEVisitedLinkColor; set { if (_visitedLinkColor != value) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkUtilities.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkUtilities.cs index 259e485424b..5b8db64f105 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkUtilities.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/Labels/LinkUtilities.cs @@ -110,6 +110,21 @@ public static Color IEVisitedLinkColor } } + /// + /// Gets a light blue link color suitable for dark mode backgrounds. + /// + public static Color DarkModeLinkColor => Color.FromArgb(102, 178, 255); + + /// + /// Gets a light red active link color suitable for dark mode backgrounds. + /// + public static Color DarkModeActiveLinkColor => Color.FromArgb(255, 128, 128); + + /// + /// Gets a light purple visited link color suitable for dark mode backgrounds. + /// + public static Color DarkModeVisitedLinkColor => Color.FromArgb(200, 162, 255); + /// Produces a color for visited links using SystemColors public static Color GetVisitedLinkColor() {