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

如何让ToolStripButton显示复选框而非仅蓝色选中边框?

我之前刚好解决过这个问题,给你两个实用的实现方案,能让你的ToolStripButton显示直观的复选框样式,彻底替代默认的蓝色边框选中标识:

方案1:自定义ToolStrip渲染器(适合批量修改现有按钮)

这个方案不需要改动现有控件,只需要给ToolStrip设置一个自定义渲染器,就能让所有开启了复选功能的ToolStripButton显示复选框:

using System.Drawing;
using System.Windows.Forms;

public class CheckBoxStyleRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
    {
        // 先绘制默认的按钮背景
        base.OnRenderButtonBackground(e);
        
        // 判断当前项是否是开启了复选的ToolStripButton
        if (e.Item is ToolStripButton button && button.CheckOnClick)
        {
            // 计算复选框的绘制位置(这里设为按钮左侧居中,可根据需求调整)
            var checkBoxRect = new Rectangle(3, (button.Height - 16) / 2, 16, 16);
            
            // 绘制标准系统样式的复选框
            ControlPaint.DrawCheckBox(
                e.Graphics, 
                checkBoxRect, 
                button.Checked ? ButtonState.Checked : ButtonState.Normal
            );
        }
    }
}

使用方式很简单,在窗体初始化时给ToolStrip绑定这个渲染器:

// 假设你的ToolStrip控件名为toolStrip1
toolStrip1.Renderer = new CheckBoxStyleRenderer();

别忘了把目标ToolStripButton的CheckOnClick属性设为true,这样点击按钮才会切换选中状态。

方案2:继承ToolStripButton重绘(更灵活的自定义控件)

如果需要更精细化的控制(比如调整复选框和文本的间距、自定义复选框样式),可以直接继承ToolStripButton重写绘制逻辑:

using System.Drawing;
using System.Windows.Forms;

public class CheckableToolStripButton : ToolStripButton
{
    public CheckableToolStripButton() : base()
    {
        // 默认开启复选点击功能
        CheckOnClick = true;
        // 清空默认图片,避免和我们绘制的复选框冲突
        Image = null;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        // 绘制按钮背景(跳过默认的Image绘制)
        base.OnPaint(new PaintEventArgs(e.Graphics, e.ClipRectangle));
        
        // 绘制复选框
        var checkBoxRect = new Rectangle(3, (Height - 16) / 2, 16, 16);
        ControlPaint.DrawCheckBox(
            e.Graphics, 
            checkBoxRect, 
            Checked ? ButtonState.Checked : ButtonState.Normal
        );
        
        // 绘制按钮文本(偏移位置,避开复选框)
        var textRect = new Rectangle(22, 0, Width - 25, Height);
        TextRenderer.DrawText(
            e.Graphics, 
            Text, 
            Font, 
            textRect, 
            ForeColor, 
            TextFormatFlags.VerticalCenter | TextFormatFlags.Left
        );
    }
}

使用时,你可以直接在设计器里添加这个自定义控件,或者通过代码创建:

var checkButton = new CheckableToolStripButton { Text = "启用功能" };
toolStrip1.Items.Add(checkButton);

注意事项

  • 两种方案都需要确保按钮的CheckOnClick属性为true,否则无法触发选中状态切换;
  • 如果你需要调整复选框的大小或位置,修改代码中checkBoxRect的参数即可;
  • 方案1会影响所有开启了CheckOnClick的ToolStripButton,方案2则是单独的自定义控件,按需选择即可。

内容的提问来源于stack exchange,提问作者Trevortni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:54:11