勇哥的C#版继承Treeview的带按钮的树形控件(带源码)

勇哥注:

此控件是继承TreeView控件重写的用户组件,主要特点是可以在节点文本右边添加按钮。

按钮本身就是一个Button类,可以设置按钮的显示相关的属性,以及事件等。

此控件可以方便提供IO、气缸、轴的测试功能,不用双击弹出另一个窗口做这些事。有效的提升了用户体验。


image.png


使用方法说明:


(1)此控件带一个WpfTreeHelper类,以方便操作控件

(2)初始化树时,无论是根结点,还是子节点,都使用AddNode方法来完成。

            tree.ClearAllNode();
            tree.AddNode(null, "根1", -1, null);
            tree.AddNode("根1", "气缸,叶1", 0, createBtnByNodeType);
            tree.AddNode("根1", "气缸,叶2", 0, createBtnByNodeType);
            tree.AddNode("根1", "轴,叶3", 1, null);
            tree.AddNode("根1", "叶4", -1, null);
            tree.AddNode("叶4", "输入IO,叶41", 3, createBtnByNodeType);
            tree.AddNode("叶4", "输入IO,叶42", 3, createBtnByNodeType);
            tree.AddNode("叶4", "输出IO,叶43", 2, createBtnByNodeType);
            tree.ExpandAllNode();

方法原型如下:

        /// <summary>
        /// 如果parentNodeName为null或空串,则创建父节点,否则创建父节点的子节点; 异常:ArgumentException
        /// </summary>
        /// <param name="parentNodeName"></param>
        /// <param name="nodeName"></param>
        public void AddNode(string parentNodeName, string nodeName,int nodetype, 
            CreateButtonDelegate createBtnFunction)

nodeName这里约定型如:  节点类型,节点名字

例如: “气缸,叶1”

           ”输入IO,叶41“

image.png

控件内部会按“节点类型”字符串进行归类,给予索引。

比如上面的初始化代码,归类为4种节点类型,索引为0,1,2,3

在方法最后一个参数的委托方法中,使用这个索引来创建不同属性的按钮。


CreateButtonDelegate是一个委托方法,需要你自己来实现。

下面是调用者实现了此委托,它主要用于区分节点类型,以此来决定按钮应该有几个、显示什么内容。

        private ButtonMenu createBtnByNodeType(string nodeName,int nodetype)
        {
            ButtonMenu btnMenuObj = null;
            Button btnObj1 = null;
            Button btnObj2 = null;
          
            switch (nodetype)
            {
                case 0: // "气缸":
                    btnMenuObj = new ButtonMenu(this.wpfTreeView1);
                    btnObj1 = new Button();
                    btnObj1.Text = "升起";
                    btnObj1.Width = 40;
                    btnObj1.Tag = $"{nodeName}|升起";
                    btnMenuObj.AddButtonItems(new ButtonItem(btnObj1, "", new ButtonItemClickEventHandler(upClick)));
                    btnObj2 = new Button();
                    btnObj2.Text = "降下";
                    btnObj2.Width = 40;
                    btnObj2.Tag = $"{nodeName}|降下";
                    btnMenuObj.AddButtonItems(new ButtonItem(btnObj2, "", new ButtonItemClickEventHandler(downClick)));
                    break;
                case 1: // "轴":
                    btnMenuObj = null;
                    break;
                case 2: // "输出IO":
                    btnMenuObj = new ButtonMenu(this.wpfTreeView1);
                    btnObj1 = new Button();
                    btnObj1.Text = "  ";
                    btnObj1.Width = 40;
                    btnObj1.Tag = $"{nodeName}|  ";
                    btnMenuObj.AddButtonItems(new ButtonItem(btnObj1, "", new ButtonItemClickEventHandler(outClick)));
                    break;
                case 3: // "输入IO":
                    btnMenuObj = new ButtonMenu(this.wpfTreeView1);
                    btnObj1 = new Button();
                    btnObj1.Text = "  ";
                    btnObj1.Width = 40;
                    btnObj1.Tag = $"{nodeName}|  ";
                    btnMenuObj.AddButtonItems(new ButtonItem(btnObj1, "", null));
                    break;
               
            }
            return btnMenuObj;
        }


(3)WpfTreeHelper.GetNodeInfoList() 可以取全部节点的信息。

节点信息是NodeStruct结构体,它可以方便查阅节点的级别、类型、同级索引等信息。

   public struct NodeStruct: IComparable<NodeStruct>
    {
        /// <summary>
        /// 节点名字
        /// </summary>
        public string NodeName;
        /// <summary>
        /// 节点级别,顶层节点为0
        /// </summary>
        public int NodeLevel;
        /// <summary>
        /// 父结点的名字
        /// </summary>
        public string ParentNodeName;
        /// <summary>
        /// 同父节点的子项目的索引号
        /// </summary>
        public int Index;
        /// <summary>
        /// 选择的状态,有三种: 0不勾选Unchecked, 1勾选Checked, 2不确定Indeterminate(暂时不支持此状态,为保留状态)
        /// </summary>
        public int CheckStatus;

        /// <summary>
        /// 结点类型,0调试结点,1调试IO结点, 2调试气缸结点
        /// </summary>
        public int NodeType;

        /// <summary>
        /// 创建按钮的委托
        /// </summary>
        /// <param name="nodeName"></param>
        /// <returns></returns>
        public WpfTreeHelper.CreateButtonDelegate CreateNodeButton;

        public int CompareTo(NodeStruct other)
        {
            if (Index > other.Index) return 1;
            else if (other.Index < Index) return -1;
            else return 0;
        }
    }

(4)wpfTreeview控件的属性ButtonDisplayMode可以在三种方式进行切换。

三种模式指的是按钮出现的时机。

image.png




源码下载:

---------------------

支付5元或购买VIP会员后,才能查看本内容!立即支付升级会员查询订单



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2023-03-24 09:54:00 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864