当前位置: 首页 > news >正文

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);

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

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 新版 eslintrc 文件弃用 .eslintignore已弃用 替代方案
  • 如何实现POE交换机串联?
  • 【蓝桥杯】每日练习 Day11 逆序对问题和多路归并
  • 美亚科技业绩波动明显:现金流为负,四起未决诉讼涉金额1700万
  • Flask(三)路由与视图函数
  • JavaScript流程控制精讲(二)运算符与循环实战
  • HTML应用指南:利用POST请求获取全国小龙坎门店位置信息
  • 一加13T手机三证齐全:骁龙8至尊版小屏机、80W快充
  • Linux离线安装Docker教程
  • 如何从0设计开发一款JS-SDK
  • 数据库与表的操作
  • (UI自动化测试web端)第二篇:元素定位的方法_xpath扩展(工作当中用的比较多)
  • Gradle Project import Eclipse
  • Taro 深度解析:跨端框架的设计哲学与实践精髓
  • HCIP 学习第一次笔记
  • 【学习记录】vue3中 Ref跟ref的区别?
  • jenkins批量复制视图项目到新的视图
  • Jupyter Notebook :美化读取到的JSON格式的数据(以表格形式呈现)
  • Unity 与 JavaScript 的通信交互:实现跨平台的双向通信
  • 【MySQL基础-12.2】MySQL 外连接详解:LEFT JOIN, RIGHT JOIN 和 FULL JOIN 的全面指南
  • 顺德网站建设公司价位/网址最新连接查询
  • 真么在网站里搜索/百度实时热搜榜
  • 可以看那种东西的浏览器/鄂州网站seo
  • 有哪些好的网页设计/优化设计全部答案
  • 增城网站建设推广/国外产品推广平台
  • 企业做app好还是网站好/seo研究协会