ListView 是一个垂直可滚动的区域,它链接到并显示项目列表。
ListView 是一个 ScrollView,它具有额外的逻辑来显示垂直排列的 VisualElement 列表。列表中的每个 VisualElement 都绑定到数据源列表中的相应元素。数据源列表可以包含任何类型的元素。
创建 VisualElement 以及将它们绑定或解除绑定到数据源所需的逻辑,将根据预期结果而有所不同。为了使 ListView 正确运行,您必须至少提供 itemsSource 的值。
对于更复杂的项目,还建议提供以下属性
- makeItem
- bindItem
- unbindItem
- destroyItem
- 使用 CollectionVirtualizationMethod.FixedHeight 时,使用 fixedItemHeightListView
为可见项目创建多个 VisualElement 对象。当用户滚动时,ListView 会回收这些对象,并将它们重新绑定到新的数据项。
若要以像素为单位设置单个项目的高度,请在 UXML 中设置 item-height
属性,或在 C# 中设置 ListView.itemHeight 属性,以将其设置为所需的值。
若要在可滚动区域周围显示边框,请在 UXML 中设置 show-border
属性,或在 C# 中设置 ListView.showBorder 属性,以将其设置为 true
。
默认情况下,用户一次只能选择列表中的一个元素。若要更改默认选择,请在 UXML 中使用 selection-type
属性,或使用 ListView.selectionType 属性在 C# 中进行更改。若要允许用户同时选择多个元素,请将属性设置为 Selection.Multiple
。若要防止用户选择项目,请将属性设置为 Selection.None
。
默认情况下,ListView 中的所有行都具有相同的背景色。若要使行背景色交替,请在 UXML 中设置 show-alternating-row-backgrounds
属性,或在 C# 中设置 ListView.showAlternatingRowBackgrounds 属性,以将其设置为 AlternatingRowBackground.ContentOnly 或 AlternatingRowBackground.All。有关详细信息,请参阅 AlternatingRowBackground。
默认情况下,用户无法重新排序列表的元素。若要允许用户拖动元素以重新排序,请在 UXML 中设置 reorderable
属性,或在 C# 中设置 ListView.reorderable 属性,以将其设置为 true
。
若要使 ListView 中的第一个项目显示列表中的项目数,请在 UXML 中设置 show-bound-collection-size
属性,或将 ListView.showBoundCollectionSize 设置为 true。这在调试时很有用。默认情况下,ListView 的滚动元素只垂直滚动。
若要使水平滚动在显示的元素比可见区域宽时启用,请在 UXML 中设置 horizontal-scrolling-enabled
属性,或将 ListView.horizontalScrollingEnabled 设置为 true
。有关详细信息,请参阅 ListView。
以下示例创建一个包含一千个项目的列表视图的编辑器窗口。
using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.UIElements;
public class ListViewExampleWindow : EditorWindow { [MenuItem("Window/ListViewExampleWindow")] public static void OpenDemoManual() { GetWindow<ListViewExampleWindow>().Show(); }
public void OnEnable() { // Create a list of data. In this case, numbers from 1 to 1000. const int itemCount = 1000; var items = new List<string>(itemCount); for (int i = 0; i <= itemCount - 1; i++) items.Add(i.ToString());
// The "makeItem" function is called when the // ListView needs more items to render. Func<VisualElement> makeItem = () => new Label();
// As the user scrolls through the list, the ListView object // recycles elements created by the "makeItem" function, // 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) => (e as Label).text = items[i];
// Provide the list view with an explicit height for every row // so it can calculate how many items to actually display const int itemHeight = 16;
var listView = new ListView(items, itemHeight, makeItem, bindItem) { // Enables multiple selection using shift or ctrl/cmd keys. selectionType = SelectionType.Multiple };
// Set up list view so that you can add or remove items dynamically. listView.showAddRemoveFooter = true;
// Implement functionality on the list view to add or remove items. // Note: The "onAdd" and "onRemove" callbacks are optional and you should only use them to override the default logic. listView.onAdd = view => { var itemsSourceCount = view.itemsSource.Count; view.itemsSource.Add(itemsSourceCount.ToString()); view.RefreshItems(); view.ScrollToItem(itemsSourceCount); }; listView.onRemove = view => { var itemsSourceCount = view.itemsSource.Count; view.itemsSource.RemoveAt(itemsSourceCount - 1); view.RefreshItems(); view.ScrollToItem(itemsSourceCount - 2); };
// Single click triggers "selectionChanged" with the selected items. (f.k.a. "onSelectionChange") // Use "selectedIndicesChanged" to get the indices of the selected items instead. (f.k.a. "onSelectedIndicesChange") listView.selectionChanged += objects => Debug.Log($"Selected: {string.Join(", ", objects)}");
// Double-click triggers "itemsChosen" with the selected items. (f.k.a. "onItemsChosen") listView.itemsChosen += objects => Debug.Log($"Double-clicked: {string.Join(", ", objects)}");
listView.style.flexGrow = 1.0f;
rootVisualElement.Add(listView);
// Allow to add items, but only when there is no override, by using a Toggle. listView.allowAdd = true; var toggle = new Toggle("Override Add functionality") { value = listView.overridingAddButtonBehavior != null, style = {alignSelf = Align.Auto}, }; toggle.RegisterValueChangedCallback(evt => listView.overridingAddButtonBehavior = evt.newValue ? (view, button) => { Debug.Log("You cannot add new items at this time"); } : null ); rootVisualElement.Add(toggle); } }
bindItem | 用于将数据项绑定到视觉元素的回调。 |
destroyItem | 当通过 makeItem 创建的 VisualElement 不再需要且将被销毁时调用的回调。 |
itemTemplate | 一个 UXML 模板,用于构建列表中每个回收和重新绑定的元素。此模板旨在替换 makeItem 定义。 |
makeItem | 用于构造 VisualElement 的回调,该元素是列表中每个回收和重新绑定元素的模板。 |
unbindItem | 用于将数据项从 VisualElement 解绑的回调。 |
ListView | 使用所有默认属性创建一个 ListView。ListView.itemsSource 必须全部设置,ListView 才能正常工作。 |
arraySizeFieldUssClassName | 当 show bound collection size 启用时,ListView 的大小字段的 USS 类名 |
arraySizeFieldWithFooterUssClassName | 当启用页脚时,ListView 的大小字段的 USS 类名。 |
arraySizeFieldWithHeaderUssClassName | 当启用折叠标题时,ListView 的大小字段的 USS 类名。 |
emptyLabelUssClassName | ListView 为空时显示的标签的 USS 类名。 |
foldoutHeaderUssClassName | ListView 的折叠标题的 USS 类名。 |
footerAddButtonName | 页脚中添加按钮元素的名称。 |
footerRemoveButtonName | 页脚中删除按钮元素的名称。 |
footerUssClassName | ListView 的页脚的 USS 类名。 |
itemUssClassName | ListView 元素中项目元素的 USS 类名。 |
listViewWithFooterUssClassName | 当启用添加/删除页脚时,ListView 的 USS 类名。 |
listViewWithHeaderUssClassName | 当启用折叠标题时,ListView 的 USS 类名。 |
overMaxMultiEditLimitClassName | 当 ListView 尝试编辑过多项目时显示的标签的 USS 类名。 |
reorderableItemContainerUssClassName | 可重新排序的动画 ListView 中的项目容器的 USS 类名。 |
reorderableItemHandleBarUssClassName | 可重新排序的动画 ListView 中的拖动句柄栏的 USS 类名。 |
reorderableItemHandleUssClassName | 可重新排序的动画 ListView 中的拖动句柄的 USS 类名。 |
reorderableItemUssClassName | 可重新排序的动画 ListView 元素中的项目元素的 USS 类名。 |
reorderableUssClassName | 可重新排序的动画 ListView 元素的 USS 类名。 |
scrollViewWithFooterUssClassName | 当启用添加/删除页脚时,滚动视图的 USS 类名。 |
ussClassName | ListView 元素的 USS 类名。 |
borderUssClassName | 具有边框的 BaseVerticalCollectionView 元素的 USS 类名。 |
dragHoverBarUssClassName | 拖动悬停栏的 USS 类名。 |
dragHoverMarkerUssClassName | 用于指示深度的拖动悬停圆形标记的 USS 类名。 |
itemAlternativeBackgroundUssClassName | BaseVerticalCollectionView 中奇数行的 USS 类名。 |
itemDragHoverUssClassName | 拖动悬停时应用于项目元素的 USS 类名。 |
itemSelectedVariantUssClassName | BaseVerticalCollectionView 中选定项目元素的 USS 类名。 |
listScrollViewUssClassName | BaseVerticalCollectionView 中滚动视图的 USS 类名。 |
disabledUssClassName | 本地禁用元素的 USS 类名。 |
allowAdd | 此属性允许用户在单击添加按钮时允许或阻止添加项目。它必须返回 true 或 false。 |
allowRemove | 此属性允许用户在单击删除按钮时允许或阻止删除项目。它必须返回 true 或 false。 |
bindingSourceSelectionMode | 此属性控制列表中的每个元素是否会自动将其数据源设置为集合源中的正确项目。 |
headerTitle | 此属性控制使用 showFoldoutHeader 时折叠标题的文本。 |
makeFooter | 此回调允许用户为该控件创建自己的页脚。 |
makeHeader | 此回调允许用户为该控件创建自己的标题。 |
makeNoneElement | 此回调允许用户设置 Visual Element 来替换 ListView 为空时显示的“列表为空”标签。 |
onAdd | 此回调允许用户实现自己的代码,以在单击添加按钮时执行。 |
onRemove | 此回调允许用户实现自己的代码,以在单击删除按钮时执行。 |
overridingAddButtonBehavior | 此回调允许用户在单击添加按钮时实现一个下拉菜单。 |
reorderMode | 此属性控制列表视图的拖放模式。 |
showAddRemoveFooter | 此属性控制是否将页脚添加到列表视图。 |
showBoundCollectionSize | 此属性控制列表视图是否显示集合大小(项目数)。 |
showFoldoutHeader | 此属性控制列表视图是否显示标题,标题采用折叠的形式,可以展开或折叠。 |
viewController | 此视图的视图控制器,作为 BaseListViewController 转换。 |
contentContainer | 返回 BaseVerticalCollectionView 的内容容器。由于 BaseVerticalCollectionView 控件会自动管理其内容,因此这始终返回 null。 |
fixedItemHeight | 列表中单个项目的高度(以像素为单位)。 |
horizontalScrollingEnabled | 此属性控制集合视图在其内容不适合可见区域时是否显示水平滚动条。 |
itemsSource | 集合项目的數據源。 |
reorderable | 获取或设置一个值,该值指示用户是否可以拖动列表项以重新排序。 |
selectedIds | 返回数据源中选定项目的持久 ID,无论它们是否已折叠。始终返回一个可枚举对象,即使未选择任何项目或只选择了一个项目。 |
selectedIndex | 返回或设置数据源中选定项目的索引。如果选择了多个项目,则返回第一个选定项目的索引。如果提供了多个项目,则将它们全部设置为选中状态。 |
selectedIndices | 返回数据源中选定项目的索引。始终返回一个可枚举对象,即使未选择任何项目或只选择了一个项目。 |
selectedItem | 返回数据源中的选定项目。如果选择了多个项目,则返回第一个选定项目。 |
selectedItems | 返回数据源中的选定项目。始终返回一个可枚举对象,即使未选择任何项目或只选择了一个项目。 |
selectionType | 控制选择类型。 |
showAlternatingRowBackgrounds | 此属性控制集合视图行是否交替使用背景颜色。接受来自 AlternatingRowBackground 枚举的值。 |
showBorder | 启用此属性以在集合视图周围显示边框。 |
virtualizationMethod | 当滚动条可见时,此集合将使用的虚拟化方法。接受来自 CollectionVirtualizationMethod 枚举的值。 |
binding | 将更新的绑定对象。 |
bindingPath | 要绑定的目标属性的路径。 |
canGrabFocus | 如果元素可以获得焦点,则返回 true。 |
delegatesFocus | 元素是否应该将其焦点委托给其子元素。 |
focusable | 如果元素可以获得焦点,则为 true。 |
focusController | 返回此元素的焦点控制器。 |
tabIndex | 用于在焦点环中对可获得焦点的元素进行排序的整数。必须大于或等于零。 |
childCount | 此对象 contentContainer 中子元素的数量。 |
contentRect | 元素内容区域的矩形,在元素的本地空间中。(只读) |
customStyle | VisualElement 的自定义样式属性访问器 (只读)。 |
dataSource | 为该 VisualElement 指定一个数据源,覆盖任何继承的数据源。此数据源被所有子元素继承。 |
dataSourcePath | 从数据源到值的路径。 |
dataSourceType | 可以分配给此 VisualElement 的数据源的可能类型。此信息仅供 UI Builder 使用,作为在设计时无法指定有效数据源时对数据源路径字段提供一些完成的提示。 |
disablePlayModeTint | 除非将其设置为 true,否则默认情况下会应用播放模式色调。它会按层次结构应用于此 VisualElement 及其在编辑器面板上存在的所有子元素。 |
enabledInHierarchy | 如果 VisualElement 在其自己的层次结构中启用,则返回 true。 |
enabledSelf | 如果 VisualElement 在本地启用,则返回 true。 |
experimental | 返回 UIElements 的实验性接口。 |
generateVisualContent | 委托函数,用于生成视觉元素的视觉内容。 |
hierarchy | 访问此元素的物理层次结构 |
languageDirection | 指示元素文本的方向性。该值将传播到元素的子元素。 |
layout | VisualElement 相对于其父元素的位置和大小,由布局系统计算。(只读) |
localBound | 返回一个 Rect,表示在应用变换后但在应用布局平移之前,轴对齐边界框 (AABB)。 |
name | 此 VisualElement 的名称。 |
paddingRect | 元素填充区域的矩形,在元素的本地空间中。 |
panel | 此 VisualElement 附加到的面板。 |
parent | 此 VisualElement 的父元素。 |
pickingMode | 确定此元素是否可以在鼠标事件或 IPanel.Pick 查询期间被选中。 |
resolvedStyle | 视觉元素的最终渲染样式值,如当前帧中渲染的那样。(只读) |
scaledPixelsPerPoint | 返回来自面板的缩放结果,该结果考虑了屏幕 DPI 和可自定义的缩放因子,但不考虑元素及其祖先的变换缩放。请参阅 Panel.scaledPixelsPerPoint。这应该只对面板的一部分元素调用。 |
schedule | 检索此 VisualElement 的 IVisualElementScheduler |
style | 设置 VisualElement 上的样式值。 |
styleSheets | 返回一个 VisualElementStyleSheetSet,它操作附加到此元素的样式表。 |
this[int] | 检索特定索引处的子元素。 |
tooltip | 在用户将鼠标悬停在元素上一段时间后,在信息框内显示的文本。这仅在编辑器 UI 中受支持。 |
transform | 返回此 VisualElement 的变换对象。ITransform |
usageHints | 一组提示值,指定 VisualElement 的高级预期使用模式。此属性只能在 VisualElement 尚未成为 Panel 的一部分时设置。一旦成为 Panel 的一部分,此属性就变得实际上是只读的,尝试更改它将抛出异常。适当的 UsageHints 的规范驱动系统在如何基于预期使用模式处理或加速某些操作方面做出更好的决策。请注意,这些提示不会影响行为或视觉结果,而只会影响面板及其内部元素的整体性能。建议始终考虑指定适当的 UsageHints,但请记住,某些 UsageHints 可能会在某些情况下被内部忽略(例如,由于目标平台上的硬件限制)。 |
userData | 此属性可用于将应用程序特定的用户数据与该 VisualElement 关联。 |
viewDataKey | 用于视图数据持久性,例如树展开状态、滚动位置或缩放级别。 |
visible | 指示是否应该渲染此元素。 |
visualTreeAssetSource | 存储资产引用,如果生成的元素是从 VisualTreeAsset 克隆的。 |
worldBound | 返回一个 Rect,表示在应用世界变换后,轴对齐边界框 (AABB)。 |
worldTransform | 返回一个矩阵,该矩阵累积了以下操作(按顺序):-本地缩放 -本地旋转 -本地平移 -布局平移 -父世界变换(递归定义 - 当没有父元素时考虑单位矩阵) |
SetViewController | 为该视图指定视图控制器,并注册其正常运行所需的所有事件。 |
AddToSelection | 将项目添加到所选项目集合中。 |
ClearSelection | 取消选择任何选定项目。 |
GetRootElementForId | 获取指定集合视图项目的根元素。 |
GetRootElementForIndex | 获取指定集合视图项目的根元素。 |
Rebuild | 清除集合视图,重新创建所有可见的视觉元素,并重新绑定所有项目。 |
RefreshItem | 如果项目当前在集合视图中可见,则重新绑定单个项目。 |
RefreshItems | 重新绑定所有当前可见的项目。 |
RemoveFromSelection | 从所选项目集合中删除项目。 |
ScrollTo | 滚动到特定 VisualElement。 |
ScrollToItem | 滚动到特定项目索引并使其可见。 |
ScrollToItemById | 滚动到特定项目 ID 并使其可见。 |
SetSelection | 设置当前选定项目。 |
SetSelectionWithoutNotify | 设置一组选定项目,而不会触发选择更改回调。 |
HasBubbleUpHandlers | 如果已将事件传播 BubbleUp 阶段的事件处理程序附加到此对象,则返回 true。 |
HasTrickleDownHandlers | 如果已将事件传播 TrickleDown 阶段的事件处理程序附加到此对象,则返回 true。 |
RegisterCallback | 将事件处理程序添加到实例。如果已为同一阶段(TrickleDown 或 BubbleUp)注册了事件处理程序,则此方法无效。 |
RegisterCallbackOnce | 将事件处理程序添加到实例。如果已为同一阶段(TrickleDown 或 BubbleUp)注册了事件处理程序,则此方法无效。事件处理程序会在恰好调用一次后自动取消注册。 |
UnregisterCallback | 从实例中删除回调。 |
Blur | 告诉元素释放焦点。 |
Focus | 尝试将焦点赋予此元素。 |
Add | 将元素添加到此元素的 contentContainer |
AddToClassList | 将类添加到元素的类列表中,以便从 USS 分配样式。请注意,类名区分大小写。 |
BringToFront | 将此元素移至其父级子元素列表的末尾。该元素将在视觉上位于任何重叠的同级元素的前面。 |
Children | 返回其 contentContainer 中的元素。 |
ClassListContains | 在该元素的类列表中搜索类。 |
Clear | 从该元素的 contentContainer 中删除所有子元素 |
ClearBinding | 从元素中删除绑定。 |
ClearBindings | 从元素中删除所有绑定。 |
ClearClassList | 从该元素的类列表中删除所有类。AddToClassList |
Contains | 检查该元素是否为指定子元素的祖先。 |
ContainsPoint | 检查指定点是否与该 VisualElement 的布局相交。 |
ElementAt | 检索特定索引处的子元素。 |
EnableInClassList | 启用或禁用具有给定名称的类。 |
FindAncestorUserData | 向上搜索该 VisualElement 的层次结构,并检索存储的 userData(如果有)。 |
FindCommonAncestor | 在 VisualTree 层次结构中找到两个 VisualElement 之间的最低共同祖先。 |
GetBinding | 获取为提供的目标属性提供的绑定实例。 |
GetBindingInfos | 获取当前元素所有绑定的信息。 |
GetClasses | 检索该元素的类。 |
GetDataSourceContext | 查询绑定对象的 dataSource 和 dataSourcePath。 |
GetFirstAncestorOfType | 从该元素的父元素开始向上遍历层次结构,并返回此类型的第一个 VisualElement |
GetFirstOfType | 从该元素开始向上遍历层次结构,并返回此类型的第一个 VisualElement |
GetHierarchicalDataSourceContext | 查询从层次结构继承的 dataSource 和 dataSourcePath。 |
HasBinding | 允许知道目标属性是否与其关联的绑定。 |
IndexOf | 检索指定 VisualElement 的子索引。 |
Insert | 将元素插入到该元素的 contentContainer 中 |
MarkDirtyRepaint | 在下一帧触发 VisualElement 的重新绘制。当发生需要重新绘制的更改时,此方法会在内部调用,例如当 UIElements.BaseField_1.value 更改或 Label 中的文本更改时。如果您正在实现自定义控件,则可以在发生需要重新绘制的更改时调用此方法来触发重新绘制,例如,当使用 generateVisualContent 渲染网格并且网格数据现在已更改时。 |
PlaceBehind | 将此元素放在同级元素之前,在他们的父级子元素列表中。如果元素和同级元素的位置重叠,则元素将在视觉上位于其同级元素的后面。 |
PlaceInFront | 将此元素放在同级元素之后,在他们的父级子元素列表中。如果元素和同级元素的位置重叠,则元素将在视觉上位于其同级元素的前面。 |
Remove | 从 contentContainerhierarchy 中删除此子元素。 |
RemoveAt | 从该元素的 contentContainer 中删除位于此位置的子元素 |
RemoveFromClassList | 从元素的类列表中删除类。 |
RemoveFromHierarchy | 从其父级层次结构中删除此元素。 |
SendEvent | 将事件发送到事件处理程序。 |
SendToBack | 将此元素发送到其父级子元素列表的开头。该元素将在视觉上位于任何重叠的同级元素的后面。 |
SetBinding | 在目标和源之间指定绑定。 |
SetEnabled | 更改 VisualElement 启用状态。禁用的 VisualElement 不会接收大多数事件。 |
Sort | 重新排列来自此 VisualElement contentContainer 的子元素。 |
ToggleInClassList | 在将给定类名添加到类列表和从中删除类名之间切换。 |
TryGetBinding | 获取为提供的目标属性提供的绑定实例。 |
TryGetDataSourceContext | 查询绑定对象的 dataSource 和 dataSourcePath。 |
TryGetLastBindingToSourceResult | 返回绑定对象从 UI 到数据源的最后一个 BindingResult。 |
TryGetLastBindingToUIResult | 返回绑定对象从数据源到 UI 的最后一个 BindingResult。 |
CreateViewController | 为该视图创建视图控制器。在继承者中覆盖此方法以更改控制器类型。 |
HandleEventBubbleUp | 在 BubbleUp 阶段,在此元素的 BubbleUp 回调之前立即执行此元素上的逻辑。调用 StopPropagation 将阻止此方法沿传播路径的进一步调用。 |
HandleEventTrickleDown | 在 TrickleDown 阶段,在此元素的 TrickleDown 回调之后立即执行此元素上的逻辑。调用 StopPropagation 将阻止此方法沿传播路径的进一步调用。 |
NotifyPropertyChanged | 通知数据绑定系统控件的属性已更改。 |
itemsAdded | 此事件在每个添加到 itemsSource 的项目上调用。包括项目索引。 |
itemsRemoved | 此事件在每个从 itemsSource 中删除的项目上调用。包括项目索引。 |
canStartDrag | 当拖放操作想在此集合视图中启动时调用。 |
dragAndDropUpdate | 当拖放操作在此集合视图中更新时调用。 |
handleDrop | 当拖放操作在此集合视图中释放时调用。 |
itemIndexChanged | 当项目在 itemsSource 中移动时调用。 |
itemsChosen | 当用户对一个或多个项目进行操作时触发的回调,例如双击或按 Enter 键。 |
itemsSourceChanged | 当垂直集合视图的数据源被分配了一个新的引用或新类型时引发。 |
onItemsChosen | 已过时。请使用 BaseVerticalCollectionView.itemsChosen 代替。 |
onSelectedIndicesChange | 已过时。请使用 BaseVerticalCollectionView.selectedIndicesChanged 代替。 |
onSelectionChange | 已过时。请使用 BaseVerticalCollectionView.selectionChanged 代替。 |
selectedIndicesChanged | 当选择发生变化时触发的回调。 |
selectionChanged | 当选择发生变化时触发的回调。 |
setupDragAndDrop | 当拖放操作在此集合视图中启动时调用。 |