勇哥注:
此控件是继承TreeView控件重写的用户组件,主要特点是可以在节点文本右边添加按钮。
按钮本身就是一个Button类,可以设置按钮的显示相关的属性,以及事件等。
此控件可以方便提供IO、气缸、轴的测试功能,不用双击弹出另一个窗口做这些事。有效的提升了用户体验。

使用方法说明:
(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“

控件内部会按“节点类型”字符串进行归类,给予索引。
比如上面的初始化代码,归类为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可以在三种方式进行切换。
三种模式指的是按钮出现的时机。

源码下载:
---------------------
[Xhide][/Xhide]
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!