You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm中如何移除TreeView节点默认蓝色背景

C# WinForm TreeView移除节点点击蓝色背景的解决方案

以下是几种可行的解决方法:

方法一:自定义绘制节点(推荐)

通过开启TreeView的自定义绘制模式,手动控制节点的绘制逻辑,完全替换默认的选中蓝色背景。

  1. 首先设置TreeView的DrawMode属性为OwnerDrawText:
treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText;
  1. 绑定DrawNode事件,在事件中自定义绘制逻辑:
private void TreeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
    // 确定节点背景色:选中时使用TreeView的默认背景色,而非蓝色
    Color bgColor = e.Node.IsSelected ? treeView1.BackColor : e.Node.BackColor;
    using (SolidBrush bgBrush = new SolidBrush(bgColor))
    {
        e.Graphics.FillRectangle(bgBrush, e.Bounds);
    }

    // 绘制节点文本,保持原有字体和颜色
    Color textColor = e.Node.IsSelected ? treeView1.ForeColor : e.Node.ForeColor;
    using (SolidBrush textBrush = new SolidBrush(textColor))
    {
        // 偏移2像素避免文本贴边
        e.Graphics.DrawString(e.Node.Text, e.Node.NodeFont ?? treeView1.Font, textBrush, e.Bounds.X + 2, e.Bounds.Y);
    }

    // 可选:绘制自定义焦点框(如果需要区分选中状态)
    if ((e.State & TreeNodeStates.Selected) != 0)
    {
        ControlPaint.DrawFocusRectangle(e.Graphics, e.Bounds, textColor, bgColor);
    }
}

方法二:通过API禁用选中高亮

利用Windows API修改TreeView的扩展样式,移除选中时的蓝色背景效果。

  1. 先定义所需的API常量和方法:
private const int TVM_SETEXTENDEDSTYLE = 0x1100 + 44;
private const int TVS_EX_SELECTIONRECTANGLE = 0x0010;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
  1. 在TreeView加载完成后调用API修改样式:
private void TreeView1_Load(object sender, EventArgs e)
{
    // 移除选中矩形样式
    SendMessage(treeView1.Handle, TVM_SETEXTENDEDSTYLE, IntPtr.Zero, (IntPtr)(~TVS_EX_SELECTIONRECTANGLE));
}

方法三:动态修改节点颜色

当节点选中时,强制设置节点的背景色为TreeView的背景色,覆盖默认蓝色。

  1. 绑定TreeView的AfterSelect事件:
private TreeNode prevSelectedNode;

private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    // 恢复上一个选中节点的默认颜色
    if (prevSelectedNode != null)
    {
        prevSelectedNode.BackColor = treeView1.BackColor;
        prevSelectedNode.ForeColor = treeView1.ForeColor;
    }

    // 设置当前选中节点的颜色,覆盖蓝色背景
    e.Node.BackColor = treeView1.BackColor;
    e.Node.ForeColor = treeView1.ForeColor;
    prevSelectedNode = e.Node;
}

注意:此方法在TreeView失去焦点时可能出现样式回退,需额外绑定LostFocus事件处理节点颜色恢复。

内容的提问来源于stack exchange,提问作者Meliodas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:42:47