Version: 6000.3
语言: 中文
工具栏切换
双窗格拆分视图

树视图

使用 TreeView 以树状结构显示分层数据。它是一个功能强大且灵活的控件,通常用于呈现具有父子关系或嵌套结构的数据。

如果需要一个简单的项列表(而不是分层树),请考虑使用 ListView 控件。

创建树视图

你可以使用 UI Builder、UXML 和 C# 创建 TreeView。以下 C# 示例创建 TreeView:

var treeView = new TreeView();

刷新集合视图

若要刷新集合视图,可以调用RefreshItems/RefreshItemRebuild.

通常,调用RefreshItemsRefreshItem方法——这些方法仅刷新集合视图,并且成本较低。如果您调用Rebuild,则集合视图将完全重建,这可能会很昂贵。

但是,您必须调用Rebuild在以下情况下:

  • 您可以更改数据源的类型,例如从List<float>设置为List<Vector3>.
  • 您对makeItemdestroyItem.

将 TreeView 绑定到数据

可以将 TreeView 绑定到数据源。数据源可以是对象列表或字符串列表。

以下示例将 TreeView 绑定到自定义类型。

treeView.makeItem = () => new VisualElement();

var item = new VisualElement();
treeView.bindItem = (item, i) =>
{
    var c = treeView.GetItemDataForIndex<MyCustomType>(i);
};

注意:在前面的示例中,TreeView.bindItem 接收 Index。您必须将索引(而不是 ID)与GetItemDataForIndex<T>.

实现 TreeView 的拖放作

拖放是 UI 设计中的常见功能。若要实现拖放作,请重写以下方法:

在拖放作中,您可以通过拖动来启用项目的重新排序。要启用,请将reorderable属性设置为true在UI Builder、UXML和C#中。

有关示例,请参阅在窗口之间创建拖放列表和树视图。

设置 TreeView 的层次结构

要设置 TreeView 的层次结构,请声明TreeViewItemData<T>哪里T是树的数据类型,然后通过SetRootItems应用程序接口。例如,假设你有以下UXML结构:

<UXML xmlns="UnityEngine.UIElements">
    <TreeView class="the-uxml-treeview" fixed-item-height="20" />
</UXML>

您可以按如下方式设置 TreeView 的层次结构:

/// <sample>
// Create some list of data, here simply numbers in a few foldouts
var items = new List<TreeViewItemData<string>>(10);
for (var i = 0; i < 10; i++)
{
    var itemIndex = i * 10 + i;

    var treeViewSubItemsData = new List<TreeViewItemData<string>>(10);
    for (var j = 0; j < 10; j++)
        treeViewSubItemsData.Add(new TreeViewItemData<string>(itemIndex + j + 1, $"Data {i+1}-{j+1}"));

    var treeViewItemData = new TreeViewItemData<string>(itemIndex, $"Data {i+1}", treeViewSubItemsData);
    items.Add(treeViewItemData);
};

// The "makeItem" function will be called as needed
// when the TreeView needs more items to render
Func<VisualElement> makeItem = () => new Label();

// As the user scrolls through the list, the TreeView object
// will recycle elements created by the "makeItem"
// and invoke the "bindItem" callback to associate
// the element with the matching data item (specified as an index in the list)
Action<VisualElement, int> bindItem = (e, i) =>
{
    var item = treeView.GetItemDataForIndex<string>(i);
    var id = treeView.GetIdForIndex(i);
    ((Label)e).text = $"ID {id} - {item}";
};

treeView.SetRootItems(items);
treeView.makeItem = makeItem;
treeView.bindItem = bindItem;
treeView.selectionType = SelectionType.Multiple;
treeView.Rebuild();

// Callback invoked when the user double clicks an item
treeView.itemsChosen += (selectedItems) =>
{
    Debug.Log("Items chosen: " + string.Join(", ", selectedItems));
};

// Callback invoked when the user changes the selection inside the TreeView
treeView.selectedIndicesChanged += (selectedIndices) =>
{
    var log = "IDs selected: ";
    foreach (var index in selectedIndices)
    {
        log += $"{treeView.GetIdForIndex(index)}, ";
    }
    Debug.Log(log.TrimEnd(',', ' '));
};
/// </sample>

若要在 Unity 中实时试用此示例,请转到 Window > UI 工具包>示例

TreeView 常见问题解答

下面是有关 TreeView 控件的一些常见问题:

是否可以获取视图中可见的行列表?

没有专用的 API。您可以使用 UQuery 检索感兴趣的元素。

视图控制器的任何被覆盖函数是否必须调用base.Method?

仅当要扩展其默认行为时,才调用此方法。

我已向我的行添加了一个 Toggle。为什么当用户选择选择时,选择不跳转到该行?

默认情况下,仅当行的内容未使用鼠标向下事件时,才会选择该行。在这种情况下,您的 Toggle 会停止事件传播。要解决此问题,请注册一个PointerDownEvent回调为TrickleDown在切换调用SetSelection.

当用户更改视图中的选择时,如何接收回调?

建议使用selectedIndicesChanged回调以在需要时按索引检索数据。虽然您也可以使用selectionChanged,请注意,它返回一个对象列表,这在与值类型一起使用时可能会导致装箱分配。

我可以获取屏幕上可见的行的索引吗?

没有专用的 API。您可以使用bindItemunbindItem回调来跟踪这些索引userData.

如何从 ID 转换为索引,反之亦然?

BaseTreeViewController.GetIndexForIdBaseTreeViewController.GetIdForIndex.

我可以有一个水平的 TreeView 吗?

TreeView 控件不支持水平布局和虚拟化。建议将 ScrollView 与flex-direction: row水平布局元素。

例子

C# 基类和命名空间

C# 类TreeView
命名空间UnityEngine.UIElements
基类BaseTreeView

成员 UXML 属性

此元素具有以下成员属性:

名字 类型 描述
item-template UIElements.VisualTreeAsset 一个UXML模板,用于构造树中的每个回收和回弹元素。此模板旨在将makeItem定义。

继承的UXML属性

此元素从其基类继承以下属性:

名字 类型 描述
auto-expand boolean 如果为 true,则项在添加到 TreeView 时会自动展开。
binding-path string 要绑定的目标属性的路径。
fixed-item-height float 列表中单个项目的高度(以像素为单位)。

使用
virtualizationMethod设置为FixedHeight,以便集合视图正常运行。如果设置在以下情况下virtualizationMethodDynamicHeight,它作为默认高度,以帮助在布置项目之前计算所需项目的数量和可滚动区域。它应设置为项目的最小预期高度。
focusable boolean 如果为 false,则不会聚焦元素。

只有当元素的 canGrabFocus 属性为 true 时,才能聚焦该元素。
horizontal-scrolling boolean 此属性控制集合视图在内容不适合可见区域时是否显示水平滚动条。
reorderable boolean 获取或设置一个值,该值指示用户是否可以拖动列表项以对其进行重新排序。
默认值
false它允许用户在实现时将项目拖入其他视图或从其他视图拖动canStartDrag,setupDragAndDrop,dragAndDropUpdatehandleDrop.将此值设置为true以允许用户对列表中的项目重新排序。
selection-type UIElements.SelectionType 控制选择类型。
默认值
SelectionType.Single.将集合视图设置为禁用选择时,将清除所有当前选择。
show-alternating-row-backgrounds UIElements.AlternatingRowBackground 此属性控制集合视图行的背景颜色是否交替。从AlternatingRowBackground枚举。
show-border boolean 启用此属性可在集合视图周围显示边框。

如果设置为 true,则集合视图在内部使用的 ScrollView 周围显示一个边框。
tabindex int 用于对焦点环中的可聚焦元素进行排序的整数。必须大于或等于零。

设置
tabIndex值小于0(例如,−1) 从焦点环和选项卡导航中删除元素。
virtualization-method UIElements.CollectionVirtualizationMethod 滚动条可见时用于此集合的虚拟化方法。从CollectionVirtualizationMethod枚举。
默认值
FixedHeight.使用固定高度时,请指定fixedItemHeight财产。固定高度的性能更高,但内容的灵活性较差。使用时DynamicHeight,集合将等待计算实际高度。动态高度更灵活,但性能较差。

此元素还继承了以下属性VisualElement:

名字 类型 描述
content-container string 添加子元素的逻辑容器。如果将子项添加到此元素,则该子项将改为添加到此元素的内容容器中。

迭代
VisualElement.Children元素的,则使用元素的内容容器层次结构而不是元素本身。这可能会导致意外结果,例如,如果元素不直接位于内容容器的层次结构中,则导航事件会忽略元素。指IFocusRing了解更多信息。

如果内容容器与元素本身相同,则子元素将直接添加到元素中。对于大多数元素来说都是如此,但可以被更复杂的类型覆盖。

ScrollView例如,具有与自身不同的内容容器。在这种情况下,添加到滚动视图的子元素将改为添加到其内容容器元素中。虽然物理父级 (VisualElement.Hierarchy.parent) 是滚动视图的内容容器元素,它们的逻辑父元素 (VisualElement.parent) 仍然引用滚动视图本身。由于滚动视图的一些可聚焦子项不是其逻辑层次结构的一部分,例如Scroller元素,在使用顺序导航时,默认情况下不考虑这些可聚焦的子项。如果默认导航规则与您的需求不符,请参阅如何更改接下来关注的元素,了解解决方法解决方案的示例。
data-source Object 将数据源分配给此 VisualElement,该 VisualElement 将替代任何继承的数据源。此数据源由所有子级继承。
data-source-path string 从数据源到值的路径。
data-source-type System.Type 可分配给此 VisualElement 的可能数据源类型。
当设计时无法指定有效数据源时,UI 生成器仅将
此信息用作提示,以对数据源路径字段进行一些补全。
enabled boolean 如果VisualElement在本地启用。
如果 VisualElement 的父级之一隐式禁用,则
不会更改此标志。要验证这一点,请使用
enabledInHierarchy.
language-direction UIElements.LanguageDirection 指示元素文本的方向性。该值将传播到元素的子项。

设置
languageDirectionRTL只能获得文本反转等基本的 RTL 支持。要获得更全面的 RTL 支持,例如换行、自动换行或文本整形,您必须启用高级文本生成器
name string 此 VisualElement 的名称。

使用此属性可以编写面向特定元素的 USS 选择器。标准做法是为元素指定一个唯一的名称。
picking-mode UIElements.PickingMode 确定此元素是可以作为指针事件的目标还是由IPanel.Pick查询。

如果出现以下情况,则无法拾取元素:

- 它们不可见- 它们的
style.display设置为DisplayStyle.None

拾取模式为PickingMode.Ignore永远不要接收悬停伪状态。
style string VisualElement.
返回
的样式数据是根据 USS 文件或在 C# 中写入此对象的内联样式计算得出的,不表示完全解析的样式,例如 VisualElement 的最终高度和宽度。要访问这些完全解析的样式,请使用
resolvedStyle.



有关如何使用此属性和所有受支持的 USS 属性的信息,请参阅在 C# 脚本中应用样式USS 属性参考手册页。
tooltip string 用户将鼠标悬停在元素上一小段时间后,要在信息框内显示的文本。这仅在编辑器UI中受支持。
usage-hints UIElements.UsageHints 提示值的组合,用于指定VisualElement.只有当VisualElement还不是Panel.曾经是Panel,则此属性实际上变为只读,尝试更改它将引发异常。适当的规范UsageHints驱动系统根据预期的使用模式就如何处理或加速某些作做出更好的决策。请注意,这些提示不会影响行为或视觉结果,而只会影响面板和其中元素的整体性能。建议始终考虑指定适当的UsageHints,但请记住,某些UsageHints在某些情况下(例如,由于目标平台上的硬件限制),可能会在内部忽略。
view-data-key string 用于视图数据持久性,例如树展开状态、滚动位置或缩放级别。

此键用于从视图数据存储中保存和加载视图数据。如果未设置此键,则会禁用关联的持久性
VisualElement.有关更多信息,请参阅 Unity 手册中的查看数据持久性

USS 级

下表列出了所有 C# 公共属性名称及其相关的 USS 选择器。

C# 属性 USS 选择器 描述
ussClassName .unity-tree-view TreeView 元素的 USS 类名称。

Unity 将此 USS 类添加到 TreeView 元素的每个实例中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 TreeView。
itemUssClassName .unity-tree-view__item TreeView 项元素的 USS 类名称。

Unity 将此 USS 类添加到 TreeView 的每个项目元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个项。
itemToggleUssClassName .unity-tree-view__item-toggle TreeView 项切换元素的 USS 类名称。

Unity 将此 USS 类添加到 TreeView 的每个项目切换元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个项。
itemIndentsContainerUssClassName .unity-tree-view__item-indents TreeView 缩进容器元素的 USS 类名称。

Unity 将此 USS 类添加到 TreeView 的每个缩进容器元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个项。
itemIndentUssClassName .unity-tree-view__item-indent TreeView 缩进元素的 USS 类名称。

Unity 将此 USS 类添加到 TreeView 的每个缩进元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个项。
itemContentContainerUssClassName .unity-tree-view__item-content TreeView 项容器元素的 USS 类名称。

Unity 将此 USS 类添加到 TreeView 的每个项目容器元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个项。
ussClassName .unity-collection-view BaseVerticalCollectionView 元素的 USS 类名称。

Unity 将此 USS 类添加到 BaseVerticalCollectionView 元素的每个实例中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 BaseVerticalCollectionView。
borderUssClassName .unity-collection-view--with-border 带边框的 BaseVerticalCollectionView 元素的 USS 类名称。

如果实例的
BaseVerticalCollectionView.showBorder属性设置为 true。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个此类 BaseVerticalCollectionView。
itemUssClassName .unity-collection-view__item BaseVerticalCollectionView 元素中项目元素的 USS 类名称。

Unity 将此 USS 类添加到 BaseVerticalCollectionView 包含的每个项目元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个项目元素。
dragHoverBarUssClassName .unity-collection-view__drag-hover-bar 拖动悬停杆的 USS 级名称。

Unity 将此 USS 类添加到用户拖动列表中的项目时显示的栏中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 BaseVerticalCollectionView。
dragHoverMarkerUssClassName .unity-collection-view__drag-hover-marker 用于指示深度的拖动悬停圆形标记的 USS 级名称。

Unity 将此 USS 类添加到用户拖动列表中的项目时显示的栏中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 BaseVerticalCollectionView。
itemDragHoverUssClassName .unity-collection-view__item--drag-hover 在拖动悬停时应用于项目元素的 USS 类名称。

Unity 在拖动 item 元素时将此 USS 类添加到 item 元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 BaseVerticalCollectionView 项。
itemSelectedVariantUssClassName .unity-collection-view__item--selected BaseVerticalCollectionView 中所选项元素的 USS 类名称。

Unity 将此 USS 类添加到 BaseVerticalCollectionView 中的每个选定元素。这
BaseVerticalCollectionView.selectionType属性决定是否可以选择零个、一个或多个元素。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 BaseVerticalCollectionView 项。
itemAlternativeBackgroundUssClassName .unity-collection-view__item--alternative-background BaseVerticalCollectionView 中奇数行的 USS 类名称。

Unity 将此 USS 类添加到 BaseVerticalCollectionView 中的每个奇数项中,当
BaseVerticalCollectionView.showAlternatingRowBackgrounds属性设置为ContentOnlyAll.当showAlternatingRowBackgrounds属性设置为这些值中的任何一个,则奇数项的显示背景颜色与偶数项不同。该 USS 级用于区分奇数项目和偶数项目。当showAlternatingRowBackgrounds属性设置为None,则不会添加 USS 类,并且依赖它的任何样式或行为都将失效。
listScrollViewUssClassName .unity-collection-view__scroll-view BaseVerticalCollectionView 中滚动视图的 USS 类名称。

Unity 将此 USS 类添加到 BaseVerticalCollectionView 的滚动视图中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 BaseVerticalCollectionView 滚动视图。
disabledUssClassName .unity-disabled 本地禁用元素的 USS 级名称。

您还可以使用 Inspector 或 UI Toolkit Debugger 中的 Matching Selectors 部分来查看哪些 USS 选择器会影响VisualElement在其层次结构的各个层面。

其他资源

工具栏切换
双窗格拆分视图