如何让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,这样点击按钮才会切换选中状态。
如果需要更精细化的控制(比如调整复选框和文本的间距、自定义复选框样式),可以直接继承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
相关产品推荐
相关产品推荐

