C# TreeView节点自定义绘制代码实现

Dylan
Dylan
发布时间:2026-10-14 | 2人浏览过
原创

C#开发中常需增强TreeView的视觉表现,例如区分选中节点或高亮当前焦点。通过拦截NodePaint事件并手动绘制图形元素,可实现精细控制:选中时更改背景与前景色,聚焦时添加虚线边框,未选中区域则交由系统默认渲染,确保操作直观且不影响性能。

结果与目标

实现TreeView控件中特定节点的自定义外观:当节点处于选中状态时,显示为深蓝绿色底白字;当节点获得输入焦点时,在其边界绘制黑色虚线矩形。其他非选中控件保持Windows Forms默认风格。

准备条件

  1. System.Windows.Forms命名空间已引入。
  2. 窗体上存在一个实例化的 TreeView 控件(如 treeView1)。
  3. 项目已引用 System.Drawing 以使用画笔、画笔和几何结构。

真实操作顺序

第1步:订阅NodePaint事件

目的:接收节点绘制请求,以便介入自定义绘图逻辑。
入口:在设计器或代码中绑定事件。
动作:将 NodePaint 事件指向自定义处理方法,例如:

treeView1.NodePaint += OnTreeNodeCustomPaint;

第2步:实现绘图逻辑判断选中状态

目的:识别哪些节点需要特殊绘制。
入口:OnTreeNodeCustomPaint 方法内部。
动作:检查 TreeNodePaintEventArgs.State 是否包含 TreeNodeStates.Selected。若匹配,则执行自定义填充与文本绘制:

if ((e.State & TreeNodeStates.Selected) != 0)
{
 // 演示为绿底白字
 e.Graphics.FillRectangle(Brushes.DeepSkyBlue, e.Node.Bounds);

 Font nodeFont = e.Node.NodeFont;
 if (nodeFont == null) nodeFont = ((TreeView)sender).Font;
 e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.White, Rectangle.Inflate(e.Bounds, 2, 0));
}
else
{
 // 非选中节点保持默认样式
 e.DrawDefault = true;
}

第3步:实现焦点框绘制

目的:为当前键盘聚焦节点提供清晰边界提示。
入口:紧随上述逻辑之后。
动作:检查 e.State 是否包含 TreeNodeStates.Focused。若匹配,使用虚线笔画绘制收缩后的矩形框。
参数:使用 DashStyle.Dot,尺寸缩小1像素以避免溢出边界。
完成状态:聚焦节点周围出现细小黑点构成的矩形轮廓。

if ((e.State & TreeNodeStates.Focused) != 0)
{
 using (Pen focusPen = new Pen(Color.Black))
 {
  focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
  Rectangle focusBounds = e.Node.Bounds;
  focusBounds.Size = new Size(focusBounds.Width - 1,
  focusBounds.Height - 1);
  e.Graphics.DrawRectangle(focusPen, focusBounds);
 }
}

完成判断

  • 运行程序后,点击某个树节点,其背景应变为 DeepSkyBlue 色,文字变为白色。
  • 通过Tab键或鼠标单击使另一节点获取焦点但未选中时,该节点周围应出现由点组成的虚线框。
  • 非交互区域的普通节点维持原始系统主题样式。

原文有依据的排错

若自定义绘制未生效,请确认以下设置:
1. TreeView 的 DrawMode 属性必须设为 OwnerDrawText 或 OwnerDrawAll,否则不会触发 NodePaint 事件。
2. 避免在事件中调用 base.OnNodePaint 除非明确需要合并默认行为,本例通过 e.DrawDefault = true 控制分支。

简要总结

通过重写C# TreeView的节点绘制流程,开发者可以灵活调整选中与聚焦状态的视觉反馈。关键在于利用State标志位分流渲染路径,既提升了用户体验,又控制了资源消耗。以上就是C# TreeView节点自定义绘制方法的详细内容,更多关于C# WinForms界面优化的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表