Version: 6000.3
语言: 中文
最小最大滑块
多列树视图

多列列表视图

MultiColumnListView 是一个 UI 控件,通常用于显示具有多列的表格或类似网格的数据。它允许您以结构化格式呈现数据,其中每行代表一个项目或条目,每列代表该项目的特定属性或属性。

MultiColumnListView 示例
MultiColumnListView 示例

创建 MultiColumnListView

您可以使用 UXML 和 C# 创建 MultiColumnListView。以下 C# 示例创建具有两列的 MultiColumnListView:

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

刷新集合视图

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

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

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

将 MultiColumnListView 绑定到数据

可以将 MultiColumnListView 绑定到数据源,并根据提供的数据自动填充行和列。

以下示例演示如何将 MultiColumnListView 绑定到 SerializedObject。有关运行时绑定的示例,请参阅 将 ListView 绑定到具有运行时绑定的列表

如果你有一个具有以下结构的 ScriptableObject:

[Serializable]
public class Move
{
    public string name;
    public int power;
}

[Serializable]
public class Monster
{
    public string name;
    public List<Move> moves;
}

public class MonstersTeam : ScriptableObject
{
    public List<Monster> monstersList;
}

您可以使用以下代码将 MultiColumnListView 绑定到 ScriptableObject:

var multiColumnListView = new MultiColumnListView
{
    bindingPath = "monstersList",
    showBoundCollectionSize = false,
    virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight
};
multiColumnListView.columns.Add(new Column { bindingPath = "name", title = "Name", stretchable = true });
multiColumnListView.columns.Add(new Column { bindingPath = "moves", title = "Moves", stretchable = true });

var so = new SerializedObject(monstersTeam);
multiColumnListView.Bind(so);

这将输出以下视图:

具有 Name 和 Moves 列的 MultiColumnListView
具有 Name 和 Moves 列的 MultiColumnListView

若要使嵌套列表成为 MultiColumnListView,请更改makeCell在“移动”列中:

var multiColumnListView = new MultiColumnListView
{
    bindingPath = "monstersList",
    showBoundCollectionSize = false,
    virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight
};
multiColumnListView.columns.Add(new Column { bindingPath = "name", title = "Name", stretchable = true });
multiColumnListView.columns.Add(new Column { bindingPath = "moves", title = "Moves", stretchable = true,
    makeCell = () =>
    {
        var movesMultiColumnListView = new MultiColumnListView
        {
            showBoundCollectionSize = false,
            virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight,
        };
        movesMultiColumnListView.columns.Add(new Column { bindingPath = "name", title = "Name", stretchable = true });
        movesMultiColumnListView.columns.Add(new Column { bindingPath = "power", title = "Power", stretchable = true });
        return movesMultiColumnListView;
    }}
); 

var so = new SerializedObject(monstersTeam);
multiColumnListView.Bind(so);

这将输出以下视图:

具有更新的移动列的 MultiColumnListView
具有更新的移动列的 MultiColumnListView

对 MultiColumnListView 进行排序

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

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

默认排序

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

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

自定义排序

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

sortColumns属性是排序列的当前状态:它按排序顺序列出列。如果按第 1 列、第 2 列、第 3 列排序,则sortedColumnslist 是 [1, 2, 3]。如果按第 3 列排序,然后按第 2 列排序,然后按第 1 列排序,则sortedColumnslist 是 [3, 2, 1]。

实现 MultiColumnListView 的拖放作

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

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

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

MultiColumnListView 常见问题解答

下面是有关 MultiColumnListView 控件的一些常见问题。

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

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

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

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

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

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

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

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

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

没有专用的 API。您可以使用column.bindCellcolumn.unbindCell以跟踪其中一列上的索引。

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

MultiColumnListView 控件不支持水平布局和虚拟化。建议将 ScrollView 与flex-direction: row水平布局元素。但是,将其应用于 MultiColumnListView 会中断虚拟化。

例子

C# 基类和命名空间

C# 类MultiColumnListView
命名空间UnityEngine.UIElements
基类BaseListView

成员 UXML 属性

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

名字 类型 描述
columns UIElements.Columns+UxmlSerializedData 多列标题的列集合。
sort-column-descriptions UIElements.SortColumnDescriptions+UxmlSerializedData 默认情况下排序列的集合。
sorting-enabled boolean 是否在多列标题中启用排序。这已弃用。用sortingMode相反。
sorting-mode UIElements.ColumnSortingMode 指示如何对列进行排序。要启用排序,请将其设置为ColumnSortingMode.DefaultColumnSortingMode.Custom.这Defaultmode 使用MultiColumnController,作用于指数。您还可以使用Custom模式,通过响应columnSortingChanged事件。

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

继承的UXML属性

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

名字 类型 描述
allow-add boolean 此属性允许用户在单击“添加按钮”时允许或阻止添加项目。它必须返回truefalse.

如果回调未设置为
false,则允许任何 Add作。
allow-remove boolean 此属性允许用户在单击“删除”按钮时允许或阻止删除项目。它必须返回truefalse.

如果属性未设置为
false,将允许任何删除作。
binding-path string 要绑定的目标属性的路径。
binding-source-selection-mode UIElements.BindingSourceSelectionMode 此属性控制列表中的每个元素是否会自动将其数据源设置获取到集合源中的正确项。

当设置为
AutoAssign,则无需指定绑定回调,因为绑定可用于填充元素。
fixed-item-height float 列表中单个项目的高度(以像素为单位)。

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

只有当元素的 canGrabFocus 属性为 true 时,才能聚焦该元素。
header-title string 此属性在使用showFoldoutHeader.

如果
makeHeadercallback 时,此属性将被覆盖,并且不显示标题。
horizontal-scrolling boolean 此属性控制集合视图在内容不适合可见区域时是否显示水平滚动条。
reorder-mode UIElements.ListViewReorderMode 此属性控制列表视图的拖放模式。
默认值
Simple.当此属性设置为Animated,Unity 会在每个项目前面添加拖动手柄,并且拖放作会在重新排序时使用动画推送项目。仅支持多项重新排序Simple拖动模式。
reorderable boolean 获取或设置一个值,该值指示用户是否可以拖动列表项以对其进行重新排序。
默认值
false它允许用户在实现时将项目拖入其他视图或从其他视图拖动canStartDrag,setupDragAndDrop,dragAndDropUpdatehandleDrop.将此值设置为true以允许用户对列表中的项目重新排序。
selection-type UIElements.SelectionType 控制选择类型。
默认值
SelectionType.Single.将集合视图设置为禁用选择时,将清除所有当前选择。
show-add-remove-footer boolean 此属性控制是否将页脚添加到列表视图。
默认值
false.当此属性设置为true,Unity 会在滚动视图下添加页脚。此页脚包含两个按钮:“+”按钮。单击后,它会在列表视图的末尾添加单个项目。一个“-”按钮。单击时,它将删除所有选定的项目,如果未选择任何项目,则删除最后一个项目。如果makeFootercallback 时,它将覆盖此属性。
show-alternating-row-backgrounds UIElements.AlternatingRowBackground 此属性控制集合视图行的背景颜色是否交替。从AlternatingRowBackground枚举。
show-border boolean 启用此属性可在集合视图周围显示边框。

如果设置为 true,则集合视图在内部使用的 ScrollView 周围显示一个边框。
show-bound-collection-size boolean 此属性控制列表视图是否显示集合大小(项数)。
默认值
true.当此属性设置为true,则 ListView 包括一个 TextField 来控制数组大小。
show-foldout-header boolean 此属性控制列表视图是否以可展开或折叠的折叠形式显示标题。
默认值
false.当此属性设置为true,Unity 会在列表视图的层次结构中添加折叠,并将滚动视图移动到新创建的折叠内。您可以使用以下命令更改此折叠的文本headerTitle属性。如果showBoundCollectionSize设置为true,则 ListView 包括一个 TextField 来控制数组大小。如果makeHeader回调,则不显示折叠。
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-list-view ListView 元素的 USS 类名称。

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

Unity 将此 USS 类添加到 ListView 包含的每个项目元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个项目元素。
emptyLabelUssClassName .unity-list-view__empty-label ListView 为空时显示的标签的 USS 类名称。

如果 ListView 为空,Unity 会将此 USS 类添加到显示的标签中。应用于此类的任何样式都会影响可视化树中样式表旁边或下方的每个空标签。
reorderableUssClassName .unity-list-view__reorderable 可重新排序的动画 ListView 元素的 USS 类名称。

Unity 会在以下情况下将此 USS 类添加到 ListView 元素的每个实例中
reorderMode设置为Animated.应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 ListView。
reorderableItemUssClassName .unity-list-view__reorderable-item 可重新排序的动画 ListView 中项元素的 USS 类名称。

Unity 将此 USS 类添加到 ListView 中的每个元素中,当
reorderMode设置为Animated.应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个元素。
reorderableItemContainerUssClassName .unity-list-view__reorderable-item__container 可重新排序的动画 ListView 中项容器的 USS 类名称。

Unity 将此 USS 类添加到 ListView 中的每个项目容器中,当
reorderMode设置为Animated.应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个项目容器。
reorderableItemHandleUssClassName .unity-list-view__reorderable-handle 可重新排序的动画 ListView 中拖动句柄的 USS 类名称。

Unity 将此 USS 类添加到 ListView 中的拖动手柄,当
reorderMode设置为Animated.应用于此类的任何样式都会影响可视化树中位于样式表旁边或下方的每个拖动手柄。
reorderableItemHandleBarUssClassName .unity-list-view__reorderable-handle-bar 可重新排序的动画 ListView 中拖动手柄栏的 USS 类名称。

Unity 将此 USS 类添加到 ListView 中的每个拖动手柄栏,当
reorderMode设置为Animated.应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个拖动手柄栏。
footerUssClassName .unity-list-view__footer ListView 页脚的 USS 类名称。

Unity 将此 USS 类添加到 ListView 中的页脚元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个 ListView。
foldoutHeaderUssClassName .unity-list-view__foldout-header ListView 折叠标头的 USS 类名称。

Unity 将此 USS 类添加到 ListView 中的 foldout 元素中。应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个折叠。
arraySizeFieldUssClassName .unity-list-view__size-field 启用

显示绑定集合大小时,Unity 将此 USS 类添加到 ListView 中的 size 字段元素中,当
showBoundCollectionSize设置为true.应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个大小字段。
arraySizeFieldWithHeaderUssClassName .unity-list-view__size-field--with-header 启用折叠标题时 ListView 的 size 字段的 USS 类名称。

Unity 将此 USS 类添加到 ListView 中的 size 字段元素中,当
showBoundCollectionSize设置为true.应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个大小字段。
arraySizeFieldWithFooterUssClassName .unity-list-view__size-field--with-footer 启用页脚时 ListView 的 size 字段的 USS 类名称。

Unity 将此 USS 类添加到 ListView 中的 size 字段元素中,当
showBoundCollectionSize设置为true.应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个大小字段。
listViewWithHeaderUssClassName .unity-list-view--with-header 启用折叠标头时 ListView 的 USS 类名称。

Unity 在以下情况下将此 USS 类添加到 ListView
showFoldoutHeader设置为true. 应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个列表。
listViewWithFooterUssClassName .unity-list-view--with-footer 启用添加/删除页脚时 ListView 的 USS 类名称。

Unity 在以下情况下将此 USS 类添加到 ListView
showAddRemoveFooter设置为true. 应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个列表。
scrollViewWithFooterUssClassName .unity-list-view__scroll-view--with-footer 启用添加/删除页脚时滚动视图的 USS 类名称。

Unity 将此 USS 类滚动视图添加到
BaseListView什么时候showAddRemoveFooter设置为true. 应用于此类的任何样式都会影响位于可视化树中样式表旁边或下方的每个列表。
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在其层次结构的各个层面。

其他资源

最小最大滑块
多列树视图