版本:Unity 6 (6000.0)
语言:English
UXML 元素 MultiColumnListView
UXML 元素 ObjectField

UXML 元素 MultiColumnTreeView

MultiColumnTreeView 是一种 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表
控件,通常用于显示具有多列的表格或网格状数据。使用 MultiColumnTreeView 以结构化格式呈现数据,其中每一行代表一个项目或条目,每一列代表该项目的特定属性或特性。

MultiColumnTreeView example
MultiColumnTreeView 示例

创建 MultiColumnTreeView

您可以使用 UXML 和 C# 创建 MultiColumnTreeView。以下 C# 示例创建了一个具有两列的 MultiColumnTreeView

var multiColumnTreeView = new MultiColumnTreeView();
multiColumnTreeView.columns.Add(new Column { title = "Name", width = 20 });
multiColumnTreeView.columns.Add(new Column { title = "Power", width = 80 });

刷新集合视图

要刷新集合视图,通常情况下,请调用 RefreshItemsRefreshItem 方法。但是,在以下情况下,请改为调用 Rebuild 来刷新集合视图

  • 您更改了 数据源 的类型,例如从 List<float> 更改为 List<Vector3>
  • 您对 makeItemdestroyItem 进行了更改。

注意:如果您调用 Rebuild,则集合视图将完全重建,这可能代价很高。如果您调用 RefreshItemsRefreshItem,则集合视图只会刷新,这代价较低。

将 MultiColumnTreeView 绑定到数据

您可以将 MultiColumnTreeView 绑定到数据源,并根据提供的数据自动填充行和列。有关示例,请参阅 创建列表和树视图

对 MultiColumnTreeView 进行排序

您可以使用默认算法为 MultiColumnTreeView 启用排序,或者如果默认排序操作的速度不足以满足您的需求,则实现自定义算法。

启用排序后,要按单个列排序,请单击列标题。要对多列进行排序,请按住 Ctrl 键(macOS:Cmd)并单击。要禁用排序,请按住 Shift 键并单击。

默认排序

要使用默认算法启用排序,请将 sortingMode 属性设置为 ColumnSortingMode.Default,并实现 Column.comparison 以按其在源中的索引比较两个项目。

有关示例,请参阅 MultiColumnTreeView 默认排序示例

自定义排序

要实现自定义排序,请将 sortingMode 属性设置为 ColumnSortingMode.Custom,并实现 columnSortingChanged 回调。在回调中,使用 sortColumns 重新排序您的列表,并在项目源更新后触发 RefreshItems()

sortColumns 属性是已排序列的当前状态:它按排序顺序列出列。如果您按列 1 排序,然后按列 2 排序,然后按列 3 排序,则 sortedColumns 列表为 [1, 2, 3]。如果您按列 3 排序,然后按列 2 排序,然后按列 1 排序,则 sortedColumns 列表为 [3, 2, 1]。

为 MultiColumnTreeView 实现拖放操作

拖放是 UI 设计中的一项常见功能。要实现拖放操作,请覆盖以下方法

  • 要启用拖动项目,请覆盖 canStartDrag
  • 要设置哪些项目被拖动,请覆盖 setupDragAndDrop
  • 要获取项目状态更改,请覆盖 dragAndDropUpdate。您可以根据拖动位置或其他条件执行某些操作。
  • 要控制拖放行为,请覆盖 handleDrop

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

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

MultiColumnTreeView 常见问题解答

以下是有关 MultiColumnTreeView 控件的一些常见问题

我如何获取屏幕上可见行的索引?

没有为此提供专门的 API。您可以使用 bindItemunbindItem 回调来跟踪这些索引。

我如何获取视图中可见行的列表?

没有为此提供专门的 API。您可以使用 UQuery 检索感兴趣的元素。

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

仅当您希望扩展其默认行为时才调用此方法。

我在我的行中添加了一个切换按钮。为什么当用户选择它时,选择不会跳转到该行?

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

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

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

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

使用 BaseTreeViewController.GetIndexForIdBaseTreeViewController.GetIdForIndex

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

MultiColumnTreeView 控件不支持水平布局和虚拟化。建议使用 ScrollView一种 UI 控件,在可视区域中显示大量控件,您可以使用滚动条查看这些控件。 更多信息
参见 术语表
以及 flex-direction: row 来水平布局元素。

示例

  • 创建列表和树视图:使用 ListView、TreeView、MultiColumnListView 和 MultiColumnTreeView 创建列表和树视图。

C# 基类和命名空间

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

成员 UXML 属性

此元素具有以下成员属性

名称 类型 描述
columns UIElements.Columns+UxmlSerializedData 多列标题的列集合。
sort-column-descriptions UIElements.SortColumnDescriptions+UxmlSerializedData 默认情况下已排序的列的集合。
sorting-enabled 布尔值 多列标题中是否启用了排序。已弃用。请改用 sortingMode
sorting-mode UIElements.ColumnSortingMode 指示如何对列进行排序。要启用排序,请将其设置为 ColumnSortingMode.DefaultColumnSortingMode.CustomDefault 模式使用 MultiColumnController 提供的排序算法,作用于索引。您还可以通过响应 columnSortingChanged 事件来使用 Custom 模式实现自己的排序。

注意:如果至少有一列已排序,则暂时禁用重新排序。

继承的 UXML 属性

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

名称 类型 描述
auto-expand 布尔值 如果为真,则在将项目添加到 TreeView 时自动展开项目。
binding-path 字符串 要绑定的目标属性的路径。
fixed-item-height 浮点数 列表中单个项目的的高度(以像素为单位)。

当使用 virtualizationMethod 设置为 FixedHeight 时,必须设置此属性,才能使集合视图正常工作。如果在 virtualizationMethod 设置为 DynamicHeight 时设置,则它用作默认高度,以帮助计算必要的项目数量和可滚动区域,然后才能布局项目。它应设置为项目的最小预期高度。
focusable 布尔值 如果元素可以聚焦,则为真。
reorderable 布尔值 获取或设置一个值,该值指示用户是否可以拖动列表项以重新排序它们。

默认值为 false,它允许用户在您实现 canStartDragsetupDragAndDropdragAndDropUpdatehandleDrop 时将项目拖到其他视图或从其他视图拖动项目。将此值设置为 true 以允许用户重新排序列表中的项目。
selection-type UIElements.SelectionType 控制选择类型。

默认值为 SelectionType.Single。当您将集合视图设置为禁用选择时,任何当前选择都将被清除。
show-alternating-row-backgrounds UIElements.AlternatingRowBackground 此属性控制集合视图行的背景颜色是否交替。取自 AlternatingRowBackground 枚举的值。
show-border 布尔值 启用此属性以在集合视图周围显示边框。

如果设置为 true,则在集合视图内部使用的 ScrollView 周围会出现边框。
tabindex 整数 用于在焦点环中对可聚焦项进行排序的整数。必须大于或等于零。
virtualization-method UIElements.CollectionVirtualizationMethod 当滚动条可见时,此集合要使用的虚拟化方法。取自 CollectionVirtualizationMethod 枚举的值。

默认值为FixedHeight。使用固定高度时,请指定fixedItemHeight属性。固定高度性能更高,但内容灵活性较差。使用DynamicHeight时,集合将等待计算实际高度。动态高度更灵活,但性能较差。

此元素还从VisualElement继承以下属性

名称 类型 描述
content-container 字符串 子元素添加到其中,通常与元素本身相同。
data-source 对象 为该 VisualElement 指定数据源,覆盖任何继承的数据源。此数据源由所有子元素继承。
data-source-path 字符串 从数据源到值的路径。
data-source-type System.Type 可分配给此 VisualElement 的数据源的可能类型。

此信息仅供 UI 构建器使用,作为提示,以便在设计时无法指定有效数据源时,为数据源路径字段提供一些自动补全。
language-direction UIElements.LanguageDirection 指示元素文本的方向性。该值将传播到元素的子元素。

将 languageDirection 设置为 RTL 通过反转文本并适当地处理换行和断字来添加对从右到左 (RTL) 的基本支持。但是,它不提供全面的 RTL 支持,因为这需要文本整形,包括字符的重新排序,以及 OpenType 字体功能支持。全面的 RTL 支持计划在未来的更新中提供,这将涉及用于处理语言、脚本和字体功能规范的其他 API。

为了增强此属性的 RTL 功能,用户可以探索 Unity Asset Store 中可用的第三方插件,并使用ITextElementExperimentalFeatures.renderedText
name 字符串 此 VisualElement 的名称。

使用此属性编写针对特定元素的 USS 选择器。标准做法是为元素提供唯一的名称。
picking-mode UIElements.PickingMode 确定此元素是否可以在鼠标事件或IPanel.Pick查询期间被拾取。
style 字符串 设置VisualElement样式值。
tooltip 字符串 在用户将鼠标悬停在元素上一段时间后,在信息框内显示的文本。这仅在编辑器 UI 中受支持。
usage-hints UIElements.UsageHints 指定VisualElement高级预期使用模式的提示值的组合。仅当VisualElement尚未成为Panel的一部分时,才能设置此属性。一旦成为Panel的一部分,此属性实际上就成为只读属性,尝试更改它将引发异常。正确UsageHints的规范使系统能够更好地决定如何根据预期的使用模式处理或加速某些操作。请注意,这些提示不会影响行为或视觉结果,而仅影响面板及其内部元素的整体性能。建议始终考虑指定正确的UsageHints,但请记住,某些UsageHints在某些条件下可能会被内部忽略(例如,由于目标平台上的硬件限制)。
view-data-key 字符串 用于视图数据持久性,例如树展开状态、滚动位置或缩放级别。

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

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,则 Unity 会将此 USS 类添加到 BaseVerticalCollectionView 元素的实例。应用于此类的任何样式都会影响视觉树中样式表旁边或下方的每个此类 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 会将此 USS 类添加到项目元素。应用于此类的任何样式都会影响视觉树中样式表旁边或下方的每个 BaseVerticalCollectionView 项目。
itemSelectedVariantUssClassName .unity-collection-view__item--selected BaseVerticalCollectionView 中选定项目元素的 USS 类名。

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

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

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

您还可以使用检查器或 UI 工具包调试器中的匹配选择器部分查看哪些 USS 选择器影响其层次结构中每个级别的VisualElement的组件。

其他资源

UXML 元素 MultiColumnListView
UXML 元素 ObjectField