C#重写treeView控件

1.先准备两张图片downdrop.png、downdrop_open.png放在项目Resources里

2.新建用户控件BaseTreeView控件

3.重写控件继承TreeView,记得删除AutoScaleMode这一行,否则会报错

复制代码
public partial class BaseTreeView : TreeView
{
    //这个属性貌似不起作用,还是得配置BackColor不知道是咋回事
    private Color nodeNormalBackColor = Color.FromArgb(10, 52, 112);
    public Color NodeNormalBackColor
    {
        get
        {
            return nodeNormalBackColor;
        }
        set
        {
            nodeNormalBackColor = value;
        }
    }

    private Color nodeSelectBackColor = Color.FromArgb(15, 92, 164);
    public Color NodeSelectBackColor
    {
        get
        {
            return nodeSelectBackColor;
        }
        set
        {
            nodeSelectBackColor = value;
        }
    }

    private Color nodeHoverBackColor = Color.FromArgb(103, 161, 207);
    public Color NodeHoverBackColor
    {
        get
        {
            return nodeHoverBackColor;
        }
        set
        {
            nodeHoverBackColor = value;
        }
    }

    private Color nodeTestColor = Color.FromArgb(203, 239, 255);

    public Color NodeTestColor
    {
        get
        {
            return nodeTestColor;
        }
        set
        {
            nodeTestColor = value;
        }
    }

    public BaseTreeView()
    {
        InitializeComponent();

        this.DrawMode = TreeViewDrawMode.OwnerDrawAll;
        this.FullRowSelect = true;
        this.ItemHeight = 46;
        this.HotTracking = true;
        this.ShowLines = true;
    }

    protected override void OnDrawNode(DrawTreeNodeEventArgs e)
    {
        base.OnDrawNode(e);

        //节点背景绘制
        if (e.Node.IsSelected)
        {
            //e.Graphics.DrawImage(Properties.Resources.tree_bg, e.Bounds);
            e.Graphics.FillRectangle(new SolidBrush(nodeSelectBackColor), e.Bounds);
        }
        else if ((e.State & TreeNodeStates.Hot) != 0)//|| currentMouseMoveNode == e.Node)
        {
            //e.Graphics.DrawImage(Properties.Resources.tree_bg, e.Bounds);
            e.Graphics.FillRectangle(new SolidBrush(nodeHoverBackColor), e.Bounds);
        }
        else if (e.Node.BackColor != null) {
            //这个是用于特殊单独需要在代码里设置结点背景颜色时使用
            Color color = e.Node.BackColor; // 获取背景色的全部分量
            e.Graphics.FillRectangle(new SolidBrush(color), e.Bounds);
        }
        else{
            e.Graphics.FillRectangle(new SolidBrush(nodeNormalBackColor), e.Bounds);
        }

        //节点头图标绘制
        if (e.Node.IsExpanded)
        {
            e.Graphics.DrawImage(Resources.downdrop_open, e.Node.Bounds.X - 18, e.Node.Bounds.Y + 10);
        }
        else if (e.Node.IsExpanded == false && e.Node.Nodes.Count > 0)
        {
            e.Graphics.DrawImage(Resources.downdrop, e.Node.Bounds.X - 18, e.Node.Bounds.Y + 10);
        }

        //文本绘制
        using (Font foreFont = new Font(this.Font, FontStyle.Regular))
        using (Brush drawTextBrush = new SolidBrush(nodeTestColor))
        {
            e.Graphics.DrawString(e.Node.Text, foreFont, drawTextBrush, e.Node.Bounds.Left + 15, e.Node.Bounds.Top + 5);
        }
    }

    protected override void OnMouseClick(MouseEventArgs e)
    {
        base.OnMouseClick(e);
        TreeNode tn = this.GetNodeAt(e.Location);
        this.SelectedNode = tn;
    }

    TreeNode currentNode = null;
    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        TreeNode tn = this.GetNodeAt(e.Location);
        Graphics g = this.CreateGraphics();
        if (currentNode != tn)
        {
            //绘制当前节点的hover背景
            if (tn != null)
                OnDrawNode(new DrawTreeNodeEventArgs(g, tn, new Rectangle(0, tn.Bounds.Y, this.Width, tn.Bounds.Height), TreeNodeStates.Hot));

            //取消之前hover的节点背景
            if (currentNode != null)
                OnDrawNode(new DrawTreeNodeEventArgs(g, currentNode, new Rectangle(0, currentNode.Bounds.Y, this.Width, currentNode.Bounds.Height), TreeNodeStates.Default));
        }
        currentNode = tn;
        g.Dispose();
    }


    protected override void OnMouseLeave(EventArgs e)
    {
        base.OnMouseLeave(e);
        //移出控件时取消Hover背景
        if (currentNode != null)
        {
            Graphics g = this.CreateGraphics();
            OnDrawNode(new DrawTreeNodeEventArgs(g, currentNode, new Rectangle(0, currentNode.Bounds.Y, this.Width, currentNode.Bounds.Height), TreeNodeStates.Default));
        }
    }

    /// <summary>
    /// 防止treeNode闪屏
    /// </summary>
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            if (!DesignMode)
            {
                cp.ExStyle |= 0x02000000;// Turn on WS_EX_COMPOSITED 
            }
            return cp;

        }
    }
}

4.重新生成程序,在工具箱中就会出现BaseTreeView控件,拉到界面中即可使用

5.在使用界面中为TreeView添加几个数据测试

复制代码
//创建父节点
TreeNode treeNode = baseTreeView1.Nodes.Add("组织结构");

//创建子节点
TreeNode treeNode_1 = new TreeNode("C");
TreeNode treeNode_2 = new TreeNode("C++");
TreeNode treeNode_3 = new TreeNode("C#");

//给父节点添加子节点
treeNode.Nodes.Add(treeNode_1);
treeNode.Nodes.Add(treeNode_2);
treeNode.Nodes.Add(treeNode_3);

将文字设置大一点,背景颜色设置的深一点更好看

相关推荐
巴拉巴拉~~2 分钟前
KMP 算法通用步进器组件:KmpStepperWidget 横向 / 纵向 + 匹配进度 + 全样式自定义
java·服务器·开发语言
贺今宵3 分钟前
使用idea启动一个springboot项目
java·ide·intellij-idea
缺点内向11 分钟前
如何在 C# .NET 中将 Markdown 转换为 PDF 和 Excel:完整指南
pdf·c#·.net·excel
伍一5115 分钟前
芋道框架下的进销存升级(三):Yudao-ERP2异步导出/导入Excel的设计与实现
java·excel·异步导出excel
胡闹5415 分钟前
【EasyExcel】字段赋值错乱问题
java·开发语言
CodeCraft Studio15 分钟前
Excel处理控件Aspose.Cells教程:使用C#在Excel中创建旭日图
c#·excel·aspose·excel旭日图·excel库·excel开发控件·excel api库
断剑zou天涯15 分钟前
【算法笔记】AC自动机
java·笔记·算法
张工摆Bug15 分钟前
《别再写满屏的if-else了!Spring Boot + 策略模式实战优化》
java
独自归家的兔17 分钟前
基于GUI-PLUS 搭配 Java Robot 实现智能桌面操控
java·开发语言·人工智能
用户37215742613518 分钟前
Python 实现 PDF 文档压缩:完整指南
java