UDN
Search public documentation:

UIListsCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UI列表系统

文档概要:虚幻引擎3中的列表的技术指南。

文档变更记录:由Ron Prestenback?创建;由Richard Nalezynski?维护。

概述

列表是数据容器。一般,“列表配置”是指那些影响一组抽象的、非类型化(untyped)的数据记录的排列和显示方式的数据。

术语

使用Lists

从概念上来说,UIList包含一组非类型化的数据。在您数据集中的每条数据对应一个单独的元素。根据您的配置列表显示数据的方式,一个元素可以对应列表中的一个单元。如果您的一条记录有多个域,一个单独的原书将通常会对应具有多列的一个单独的行(传统的“报告”模式)。在非常少的情况下,一个单独的元素将会对应具有多个行的一个单独的列,这有点像一个多层柱或翻转过来的报告的视图。

所以,您第一件需要做的事情是决定基于点击的行和列来决定 element index(元素索引) 。这个算法由类表的CellLinkType决定。在最简单的情况时,即每个单元代表一个单独的数据记录,元素索引如下所示:

NewIndex = (NumColumns * ClickedRow) + ClickedColumn;

对于使用连接的纵列的列表来说,每行是一个独立的元素,算法将如下所示:

NewIndex = ClickedRow;

这些计算只是一些例子,实际上它们不会产生好的结果。对于真正的算法,您也需要把类似于列表的当前TopIndex的信息考虑进来,但是通过这个例子您可以知道了基本的计算原理。

一旦您知道了选中元素的索引,只要把那个值传递到SetIndex()函数即可。

组件

我们成为 list(列表) 的数据展现手段由3部分组成:数据源、呈现器(presenter)及用于展现数据的容器。

UIListElementProvider: 数据源负责为列表提供元素。它处理提供选中项的最初集合;把用户的选择放置到存储单元(他可以是一个profile、远程服务器或者正在播放的游戏中的某个actor实例);以及在某些情况下,根据当前的游戏状态进制原则某些元素。

UIComp_ListPresenter:呈现器(presenter)负责格式化及渲染列表数据。它决定了要渲染的元素;元素的渲染顺序;为每个列表元素创建底层单元;把风格及风格改变传递给这些单元;确保单元在正确的状态等。

UIList:容器定义呈现器渲染列表数据所使用的参数。容器管理:

  • list layout(列表布局):元素数量;列和行的数量;定义呈现器渲染列表数据所使用的边界范围;控制一个单独的元素如何和列表的行及列映射;管理任何额外的列表助手,比如滚动条、列标题等。
  • list interaction(列表交互):跟踪选中元素的索引;跟踪一次可显示的元素的最大数量;跟踪显示的第一个元素的索引;处理随着插入和删除元素所带来的所有“后续问题”(比如,如果由于删除操作导致选中的列表的索引变为无效值,如果需要,可以调整TopIndex);存储及应用影响列表操作的用户配置数据,比如列表元素是否应该“自动换行”及是否允许选择禁用的元素。
  • input processing(输入处理):基于用户输入更新选中的索引,比如按下 上/下 箭头按键或鼠标点击;当用户移动滚动条时更新显示的元素;当用户重新调整列的大小时通知呈现器(presenter)等。

列表实例中,您或许需要考虑到的列表配置数据是CellLinkType、TopIndex、MaxVisibleItems、WrapType、bAllowDisabledItemSelection以及 bEnableMultiSelect。

列表元素映射到 列/行 的方式的区别在UIList.uc的ECellLinkType enum注释中有详细的介绍:

  • LINKED_None 意味着无论列表显示的行及列的数量是多少,都是一个列表元素映射一个列表单元,
  • LINKED_Columns 意味着行数是变化的;但是列数保持(连接的列)。仅当列表的 RowAutoSizeMode 设置为 None 时,配置的 RowCount 才有效。
  • LINKED_Rows 意味着列数是变化的;但是行数保持不变(连接的行)。

数据

由于UIList可以绑定到任何一种类型的数据上,列表本身仅使用索引进行工作。UIList.GetCurrentItem()将会返回在项目数据中的当前索引的值,它对应着为列表提供数据所使用的数据仓库中的任何数据的索引。控件和数据仓库通过界面进行通信,在这种情况下是UIListElementProvider 和 UIListElementCellProvider界面。

UIListElementProvider是一个向UIList提供到UIList.Items数组的索引的对象的接口,并且它被缓存在UIList.DataProvider变量中。

UIListElementCellProvider是用于向特定行中的每列提供真正值的对象的接口。根据绑定到列表的数据类型的不同,列表中每个元素的数据来自不同的对象(比如,在OnlineGameSearch数据仓库情况下,每个接收到的数据仓库有它自己的UIDataProvider_Settings来为那个服务器提供数据),或者它们可以全部都来自同一个对象。由于这个原因,UIListElementProvider提供了一个方法用于为一个给定索引[对应到数据仓库值的数组中的索引]查找正确的单元值 - GetElementCellValueProvider()。一旦您为选中的元素找到了正确的单元值提供者,您可以调用 GetCellFieldValue()方法来为获得您正在查找的那个特定元素的任何数据域的值。

if ( MyList->DataProvider )
{
    INT CurrentItem = MyList->GetCurrentItem();
    if(CurrentItem != INDEX_NONE )
    {
        TScriptInterface<IUIListElementCellProvider> CellProvider = MyList->DataProvider->GetElementCellValueProvider(MyList->DataSource.DataStoreFieldName, CurrentItem);
        if ( CellProvider )
        {
             //调用 GetCellFieldValue 来获得我想获得的数据域的值。
        }
    }
}