C# WinForms:如何仅在深色模式下重写ProfessionalColorTable颜色属性
优化ToolStrip菜单颜色切换方案
核心思路是拆分颜色表逻辑,通过切换不同的ProfessionalColorTable实例实现:深色模式用自定义颜色表,默认模式直接复用系统原生的ProfessionalColorTable,彻底避免在每个颜色属性中做条件判断。
1. 定义深色主题专属ColorTable
只重写需要修改的颜色属性,其余颜色自动继承系统默认(无需修改的属性不用管):
public class DarkMenuColorTable : ProfessionalColorTable { // 重写深色模式需要的菜单颜色 public override Color MenuItemSelected => Color.FromArgb(45, 45, 48); public override Color MenuItemSelectedGradientBegin => Color.FromArgb(45, 45, 48); public override Color MenuItemSelectedGradientEnd => Color.FromArgb(45, 45, 48); public override Color MenuItemPressedGradientBegin => Color.FromArgb(30, 30, 32); public override Color MenuItemPressedGradientEnd => Color.FromArgb(30, 30, 32); // 按需添加其他需要自定义的颜色(如菜单背景、边框等) }
2. 实现模式切换逻辑
提前创建好默认和深色两种Renderer实例,切换时直接替换即可:
// 全局复用的Renderer实例,避免重复创建 private readonly ToolStripProfessionalRenderer _defaultMenuRenderer = new ToolStripProfessionalRenderer(new ProfessionalColorTable()); private readonly ToolStripProfessionalRenderer _darkMenuRenderer = new ToolStripProfessionalRenderer(new DarkMenuColorTable()); private bool _isDarkMode; public void SwitchMenuTheme(bool enableDarkMode) { if (_isDarkMode == enableDarkMode) return; // 无变化则跳过 _isDarkMode = enableDarkMode; // 应用到你的ToolStrip控件(比如MenuStrip、ContextMenuStrip等) yourMenuStrip.Renderer = _isDarkMode ? _darkMenuRenderer : _defaultMenuRenderer; }
优势说明
- 完全消除了原方案中每个颜色属性内的条件判断冗余
- 默认模式直接使用系统原生颜色表,无需手动维护默认颜色值,保证和系统主题一致性
- 深色主题只需要关注需要自定义的颜色,逻辑更清晰,维护成本更低
内容的提问来源于stack exchange,提问作者Roberto D V Leonardo
相关产品推荐
相关产品推荐

