TreeView : TreeView是一个IMGUI控件,可以让您为编辑器创建树视图、列表视图和多列表。它可以自定义行内容呈现、拖拽逻辑、选择逻辑、搜索、排序和项目重命名.

TreeView类中两个重要的函数:

BuildRoot():是一个需要被实现的抽象方法。该方法应该创建treeviewitem的完整树并返回根目录。这个方法和BuildRows一起实现TreeView的初始化工作。可以使用两种不同的方法创建一个TreeView:(1)创建项目的根和完整树;(2)创建根和行.方法1是默认的,因为TreeView会自动处理构建行,祖先信息等等;对于非常大的数据集或经常更改的数据,方法2是可取的.每个TreeViewItem都需要用唯一的整数ID构造,对于相同的数据元素,ID需要保持一致,不管是否是拓展状态。ID用于在树中查找项目,用于选择状态、扩展状态和导航。对于一个被合理初始化的TreeView,所有的treeviewitem都需要初始化“父”、“子”和“深度”属性。根据树的数据模型(Tree Model)可以有用的设置父和子的属性或深度属性,然后使用SetupParentsAndChildrenFromDepths或SetupDepthsFromParentsAndChildren方法在一次调用中设置所有行未初始化的属性。

BuildRows():重写该方法可以控制如何生成行。每当调用重载时或者每次扩展或收缩时,就会调用这个方法。构建行的默认实现负责根据完整的树和项目的扩展状态来缓存扩展的行。对于非常大的数据集或经常更改的数据,只需要创建TreeView的行,而不是完整的树。在这种情况下,重写该方法以手动构建行,如果遇到收缩的父节点,那么父节点的后代就可以被忽略,设置项的孩子用CreateChildListforCollapsedParent()方法。当使用这种方法时,构建root应该只创建根TreeViewItem,也确保重写GetAncestors()和GetDescendantsThatHaveChildren()和使用模型数据获取这些信息,否则构建框架和扩大子树将会失败。

SetupDepthsFromParentsAndChildren():使用输入TreeViewItem的深度为其所有后代TreeViewItem设置正确的深度。

SetupParentsAndChildrenFromDepths():使用已设置的顺序和深度值来初始化所有行的父和子属性.

TreeViewState:TreeViewState为TreeView提供可序列化的状态信息。这主要是用户可以通过与TreeView进行交互来改变的状态,例如选择状态,扩展状态,导航状态和滚动状态.TreeViewState是唯一应该在TreeView中序列化/反序列化的状态.TreeView本身不是可序列化的,应该从它所代表的树数据中进行重构.这个类中包含的所有状态都是由TreeView自身更新的。对这个状态的访问也可以通过TreeView API完成。

解释TreeViewExmaple的几个例子:

(A)SimpleTreeView是一个继承自TreeView的类,重写了BuildRoot方法,手动构建了一棵完整的树。

SimpleTreeViewWindow中声明了序列化的TreeViewState:

[SerializeField] TreeViewState m_TreeViewState;

声明了SimpleTreeView和SearchField:

SimpleTreeView m_TreeView;

SearchField m_SearchField;

需要对它们都进行初始化:

if (m_TreeViewState == null)

m_TreeViewState = new TreeViewState ();

m_TreeView = new SimpleTreeView(m_TreeViewState);

m_SearchField = new SearchField ();

与search相关的属性和变量:

m_SearchField.downOrUpArrowKeyPressed:当焦点搜索字段检测到下或上键被按下时,就会发出这个事件,并可用于将键盘焦点转移到另一个控件,比如TreeView。

m_SearchField.OnToolbarGUII():这个函数使用工具栏UI样式显示搜索字段,并使用GUILayout类来自动计算它所呈现的矩形的位置和大小。通过一个可选的列表来指定额外的布局属性.

m_TreeView.searchString:当前的树视图的搜索字符串,存储在TreeViewState对象中.

m_TreeView.OnGUI():这是TreeView的主要GUI方法,在这里处理和绘制treeviewitem。

(B)来看一个复杂一点的例子:MultiColumnTreeView

它不直接继承自TreeView,而是继承自TreeViewWithTreeModel<MyTreeElement>,而TreeViewWithTreeModel<MyTreeElement>继承自TreeView,并且树中的节点数据也更加复杂了,是MyTreeElement类,这个类继承自TreeElement类。

那么这个关系就很自然了:

然而另一方面:TreeModel是一个实用程序类,它在一系列可序列化的树元素列表中工作,每个树元素的顺序和深度定义了树结构。它和MultiColumnTreeView又有什么关系呢?

在MultiColumnWindow中声明了两个状态:

[SerializeField] TreeViewState m_TreeViewState;

[SerializeField] MultiColumnHeaderState m_MultiColumnHeaderState;

声明了MultiColumnTreeView和SearchField:

SearchField m_SearchField;

MultiColumnTreeView m_TreeView;

这里解释两个类:MultiColumnHeaderState 和MultiColumnHeader:

MultiColumnHeader:是一个通用的类。可以使用该树视图来创建多列树视图和列表视图.它通过拖拽来支持对列宽度的调整,并为用户的输入提供有用的回调。注意,用户可以使用MultiColumnHeader的上下文菜单隐藏列。

MultiColumnHeaderState :由MultiColumnHeader产生的状态。

对状态的初始化:

if (m_TreeViewState == null)

m_TreeViewState = new TreeViewState();

bool firstInit = m_MultiColumnHeaderState == null;

var headerState = MultiColumnTreeView.CreateDefaultMultiColumnHeaderState(multiColumnTreeViewRect.width);

if (MultiColumnHeaderState.CanOverwriteSerializedFields(m_MultiColumnHeaderState, headerState))MultiColumnHeaderState.OverwriteSerializedFields(m_MultiColumnHeaderState, headerState);

m_MultiColumnHeaderState = headerState;

MultiColumnHeader的初始化,使树视图可调整列宽等:

var multiColumnHeader = new MyMultiColumnHeader(headerState);

if (firstInit)

multiColumnHeader.ResizeToFit ();

将数据加入到树中,形成树结构。

var treeModel = new TreeModel<MyTreeElement>(GetData());

m_TreeView = new MultiColumnTreeView(m_TreeViewState, multiColumnHeader, treeModel);

这里就可以明白地知道TreeModel是用来结合TreeView生成树视图结构的。

这里仅描述了实现TreeView的大概结构,可能还有不少错误,具体细节有时间再看吧。

TreeView简单介绍相关推荐

  1. php 自动安装sql,JSP_实现自动安装SQLServer数据库,下面简单介绍一下如何在工程 - phpStudy...

    实现自动安装SQLServer数据库 下面简单介绍一下如何在工程中添加Microsoft SQL Server  2000 Desktop Engine (MSDE)的自动安装合并模块MSM: 1. ...

  2. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  3. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  4. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  5. 2021年大数据ELK(二):Elasticsearch简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...

  6. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  7. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  8. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

    LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...

  9. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

最新文章

  1. 解决Ubuntu中sublime无法输入中文的问题
  2. Oracle优化11-10046事件
  3. SAP One Order redesign里的WebUI advanced search重构
  4. 2021牛客暑期多校训练营7 F-xay loves trees(线段树+滑动窗口)
  5. springmvc 拦截器_Spring MVC拦截器学习
  6. c# 第8节 变量、变量名命令规则、作用域、@的作用
  7. 如何在 Pr 2020中使用音轨混合器?
  8. cocos2d-x 播放视频 on Android
  9. 自动控制原理复习——第二章 控制系统的数学模型,系统框图简化,信号流图,梅森公式,控制系统的传递函数(详细介绍)
  10. 西安电子科技大学计算智能导论公茂果老师课程所有PPT
  11. 顶尖作者介绍 | 心理学领域研究“情绪”的大牛们有哪些?
  12. 哎,为了在vs上开发或调试linux,各种跪啊。而且后面还有更多……
  13. KMP算法的时间复杂度
  14. xcpc近年铜牌题补题路
  15. 深圳市专精特新企业申报流程及奖励政策重点介绍,补贴20-50万
  16. JS Proxy (代理)
  17. MCGS pro 下载程序时,下位机磁盘空间不足解决办法
  18. 漫谈Commons-Collections反序列化
  19. 日历签到html,简单的手机移动端日历签到js代码
  20. 利用ffmepg下载在线视频文件

热门文章

  1. Android与Flutter混合开发
  2. php过滤所有英文中文的标点符号代码
  3. 杰里之配置 DAC 单声道输出,立体声音乐没有合并输出【篇】
  4. spring中的DI依赖注入的几种常见形式
  5. 解决Android11上分享图片失败
  6. WSA安卓子系统在win10精简版本上的搭建
  7. 位、字节、字之间的关系
  8. 使用Awescnb构建酷炫的博客园皮肤
  9. 软文创意18招之五:比对手
  10. 运算放大器的理解与应用