You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:52:08