You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改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模式完全自定义绘制逻辑就能彻底解决:

  1. 先在设计器里把TreeView的OwnerDraw属性设为true
  2. 绑定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.

火山引擎 最新活动