如何修改C# Windows应用中TreeView聚焦TreeNode的背景色
解决C# TreeView节点发黑并设置DarkGray背景的方案
嘿,我之前也碰到过TreeView节点因为系统主题或者默认高亮样式导致的发黑问题,下面几种方案应该能帮你搞定:
方案1:直接设置单个节点的背景色
如果只是个别节点有问题,直接修改它的BackColor属性最省事,还可以配合调整前景色保证文字清晰:
// 示例:获取选中的节点并设置样式 if (treeView1.SelectedNode != null) { treeView1.SelectedNode.BackColor = Color.DarkGray; treeView1.SelectedNode.ForeColor = Color.White; // 可选,提升文字可读性 }
不过要注意,默认的选中高亮样式可能会覆盖这个设置,如果你是选中状态下出现发黑,得试试下面的方案。
方案2:自定义绘制TreeView节点(彻底解决样式问题)
系统默认的选中/hover样式经常会导致节点看起来发黑,开启OwnerDraw模式完全自定义绘制逻辑就能彻底解决:
- 先在设计器里把TreeView的
OwnerDraw属性设为true - 绑定TreeView的
DrawNode事件,然后添加以下代码:
private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) { // 统一设置背景色为DarkGray var backBrush = new SolidBrush(Color.DarkGray); var foreColor = Color.Black; // 处理选中状态:调整前景色,绘制自定义焦点框避免系统默认发黑 if ((e.State & TreeNodeStates.Selected) != 0) { foreColor = Color.White; e.Graphics.FillRectangle(backBrush, e.Bounds); ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, foreColor, Color.DarkGray); } else { e.Graphics.FillRectangle(backBrush, e.Bounds); } // 绘制节点文本,优先使用节点自身的字体 var textFont = e.Node.NodeFont ?? treeView1.Font; e.Graphics.DrawString(e.Node.Text, textFont, new SolidBrush(foreColor), e.Bounds.Left + 2, e.Bounds.Top + 2); // 释放Brush资源,避免内存泄漏 backBrush.Dispose(); }
这种方法能完全控制节点在所有状态下的显示效果,再也不用担心系统主题搞乱样式了。
方案3:通过选中事件强制设置样式
如果只是选中时出现发黑,也可以在节点选中后强制覆盖默认样式:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { e.Node.BackColor = Color.DarkGray; e.Node.ForeColor = Color.White; // 如果你希望失去焦点后仍然保持选中样式,把HideSelection设为false treeView1.HideSelection = false; }
小提示
- 如果你的节点用了自定义字体,绘制时记得优先用
e.Node.NodeFont而不是TreeView的默认字体 - 测试一下不同状态(选中、鼠标悬停、窗口失去焦点)下的显示效果,确保DarkGray背景在所有场景都正常
- 自定义绘制时尽量复用Brush对象,避免频繁创建导致性能问题
内容的提问来源于stack exchange,提问作者Ch.




