C# WinForm TabControl自定义选项卡颜色

认真发呆
认真发呆
发布时间:2026-10-13 | 5人浏览过
原创

当需要在C# WinForm中个性化TabControl的外观(如更改选中或禁用状态下的背景色)时,控件本身缺少直接的属性支持。解决方法是将DrawMode设置为OwnerDrawFixed,并在DrawItem事件中手动绘制每个选项卡的背景矩形和文本。

实现原理与准备条件

WinForm的TabControl采用所有者自绘模式后,系统将不再负责绘制标签页的视觉效果,开发者需要接管绘画任务。这需要利用System.Drawing.Graphics对象绘制背景填充,并使用StringFormat来控制文字的垂直居中对齐效果,确保视觉体验一致。

完整代码操作顺序

第1步:配置控件绘制模式与事件绑定

目的:告知控件停止自动绘制,并将绘图责任委托给指定的事件处理器。
入口:窗口构造函数或Load事件。
动作:设置DrawMode属性并订阅DrawItem事件。

this.tabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler(this.tabControl1_DrawItem);

第2步:实现自定义绘制逻辑 (推荐渐变方案)

目的:根据当前遍历到的选项卡索引是否等于选中索引,分别渲染不同的背景颜色和文字格式,实现立体或高亮效果。
入口:Form_Load后新增的方法。
动作:定义fntTab字体、bshBack背景和bshFore前景画笔,并通过e.Graphics.FillRectangle执行绘制。

private void tabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
   Font fntTab;
   Brush bshBack;
   Brush bshFore;
   
   // 区分选中项与非选中项的样式
   if (e.Index == this.tabControl1.SelectedIndex)
   {
     // 选中状态:加粗字体,使用向后的线性渐变背景
     fntTab = new Font(e.Font, FontStyle.Bold);
     bshBack = new System.Drawing.Drawing2D.LinearGradientBrush(
                e.Bounds, 
                SystemColors.Control, 
                SystemColors.Control, 
                System.Drawing.Drawing2D.LinearGradientMode.BackwardDiagonal);
     bshFore = Brushes.Black;
   }
   else
   {
     // 非选中状态:常规字体,纯蓝色背景
     fntTab = e.Font;
     bshBack = new SolidBrush(Color.Blue);
     bshFore = new SolidBrush(Color.Black);
   }
   
   string tabName = this.tabControl1.TabPages[e.Index].Text;
   StringFormat sftTab = new StringFormat();
   
   // 绘制背景框
   e.Graphics.FillRectangle(bshBack, e.Bounds);
   
   // 调整文字显示区域,微调Y轴偏移(例如+4)以优化视觉居中感
   Rectangle recTab = e.Bounds;
   recTab = new Rectangle(recTab.X, recTab.Y + 4, recTab.Width, recTab.Height - 4);
   
   // 绘制文字
   e.Graphics.DrawString(tabName, fntTab, bshFore, recTab, sftTab);
}

第3步:基础纯色替换 (备选简单方案)

目的:若仅需简单的红白背景切换,可使用更精简的逻辑。
重要参数:StringAlignment.Center实现文字绝对居中。

private void tabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
  StringFormat sf = new StringFormat();
  sf.LineAlignment = StringAlignment.Center;  // 垂直居中
  sf.Alignment = StringAlignment.Center;      // 水平居中
  
  if (e.Index == tabControl1.SelectedIndex)
    e.Graphics.FillRectangle(Brushes.Red, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height); // 选中:红色
  else
    e.Graphics.FillRectangle(Brushes.White, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height); // 未选:白色
    
  e.Graphics.DrawString(((TabControl)sender).TabPages[e.Index].Text,
  System.Windows.Forms.SystemInformation.MenuFont, new SolidBrush(Color.Black), e.Bounds, sf);
}

完成判断与注意事项

  • 资源释放:上述示例为了简化并未在每次绘制后立即Dispose画笔,在实际项目中频繁创建Brush可能会影响性能。建议将常用的静态画笔声明为类成员变量复用,或使用using语句块包裹动态创建的画笔。
  • 布局对齐:系统默认的居中算法有时会导致视觉上看起来偏低,因此第二个示例中使用了recTab.Y + 4进行像素级修正。
  • 版本兼容:该API适用于.NET Framework及.NET Core/5+的WinForm环境,但在WPF中应使用DataTrigger而非此类底层绘画逻辑。

以上就是C#更改tabControl选项卡颜色的详细内容,更多关于C#自定义控件外观设计的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表