如何在项视图中查询虚拟化项

本主题介绍如何使用 Microsoft UI 自动化在 Windows 7 项视图中检索有关虚拟化项的 UI 信息。 本主题包含以下各节。

注意

本主题仅适用于 Windows 7。 请注意,本主题中所述的辅助功能在 Windows 的未来版本中可能会更改。

 

概述

项目视图是一个用户界面组件,使用户能够查看文件和其他项并与之交互。 在 Windows 7 中,项视图替换了列表视图控件,用于在 Windows 资源管理器的默认视图中显示项。 “项目视图”还用于“通用项对话框”、“开始”菜单搜索结果以及使用资源管理器浏览器控件的其他 Windows 7 UI 元素中。 与列表视图控件相比,项视图为用户提供了以下优势:

  • “项目视图”能够以更有用、更所需且更相关的方式呈现项目,使用户能够更简单、更快速、更愉快地查找和组织项目。
  • “项视图”可以显示具有不同性能特征的数据源中的大型项集,使用户能够跨多个源浏览和搜索其整个项集合。

下图显示了 Windows 资源管理器中的“项”视图。

显示带有项目视图组件的 Windows 资源管理器的屏幕截图

从开发人员的角度来看,项视图的一般结构和功能类似于列表视图控件的结构和功能。 main区别在于,项视图支持虚拟化,而列表视图控件则不支持虚拟化。 此外,“项视图”使用两个新的UI 自动化接口来确保“项视图”提供的虚拟化内容可访问。 本主题的以下部分介绍了这些接口。

有关 UI 自动化 中的虚拟化的一般信息,请参阅使用虚拟化项

项目视图树结构

在UI 自动化树中,“项目视图”的顶级UI 自动化元素的名称为“ItemsView”,控件类型为“list”。 在上图中,ItemsView UI 自动化 元素的轮廓为红色。 在 ItemsView 的顶层下方存在各种UI 自动化元素,但本文档中仅引用了另外两个UI 自动化元素:组项和列表项。

组项是包含该组的所有列表项的UI 自动化元素,其控件类型为“Group”,其名称因组名称而异。 在上图中,第一个组项包含“A-H (1) ”标头和“文件夹”列表项,其名称为“A-H”。

列表项是表示视图中叶项的UI 自动化元素,它们的控件类型为“ListItem”,其名称因项名称而异。 在上图中,列表元素是叶元素,例如“Folder”、“Music”和“Picture”。 在本文档的其余部分,这三个UI 自动化元素由术语 ItemsView 元素、Group 元素和 ListItem 元素引用。

虚拟化

“项视图”使用虚拟化,这意味着不会从系统提取视图可见区域之外的项,并且不会创建它们的 UI 表示形式。 这些项称为 虚拟化项。 由于这些项未创建,因此虚拟化项没有UI 自动化元素,因此在UI 自动化客户端枚举树时不会显示在UI 自动化树中。 此外,UI 自动化控件模式仅对可见元素运行。 例如,当客户端调用 IUIAutomationSelectionPattern::GetCurrentSelection 方法时,Selection 控件模式仅返回可见的选定项。

项目视图支持检索有关虚拟化项的以下信息:

  • 项总数的计数,包括虚拟化项
  • 虚拟化项的UI 自动化元素
  • UI 自动化所选虚拟化项的元素

获取所有项的计数

客户端可以使用 ItemsView 元素获取所有项的计数以及所选项的计数。 ItemsView 元素提供两种方法来获取这些计数。 第一种是通过获取 ItemsView 元素的 ItemStatus 属性,第二种是通过从 ItemsView 元素获取自定义属性。

ItemStatus 属性是一个字符串,用于指定项总数和选定项的计数,用逗号分隔。 例如:“3 个项目,1 项已选中”。 此字符串已本地化,可直接与用户通信。

ItemsView 元素的自定义属性包括一个属性用于项计数,另一个属性用于选择计数。 它们包括:

  • ItemCount_Property_GUID (ABBF5C45-5CCC-47b7-BB4E-87CB87BBD162) - 视图中所有唯一项的计数。 如果按多值属性 (MVP) 分组,以便单个项可以多次出现,则每个项仅计数一次。

    (UIAutomationType: UIAutomationType_Int,编程名称:“ItemCount”)

  • SelectedItemCount_Property_GUID (92A053DA-2969-4021-BF27-514CFC2E4A69) - 视图中选择的所有唯一项的计数。 如果按多值属性 (MVP) 分组,以便单个项可以多次出现,则每个项仅计数一次。

    (UIAutomationType: UIAutomationType_Int,编程名称:“SelectedItemCount”)

这些自定义属性在 Shlguid.h 中定义,它包含在 Windows 软件开发工具包 (SDK) 中,这些属性通过 IUIAutomationRegistrar::RegisterProperty 方法注册。 UI 自动化客户端使用 RegisterProperty 检索自定义属性 (PROPERTYID) 的属性标识符。

获取与所有项相关的项索引

客户端可以通过获取 ListItem 元素的 ItemStatus 属性或获取 ListItem 元素的自定义属性来获取项的索引。

ItemStatus 属性是一个字符串,其中包含项相对于项总数的索引。 例如:“项 1/3”。 此字符串已本地化,可直接与用户通信。

以下自定义属性获取 ListItem 元素的项索引:

  • ItemIndex_Property_GUID (92A053DA-2969-4021-BF27-514CFC2E4A69) — 项的从 1 开始的绝对索引。 如果按多值属性 (MVP) 分组,以便单个项可以出现两次,则该项的每个外观都会获得单独的索引。

    (UIAutomationType: UIAutomationType_Int,编程名称:“ItemIndex”)

此自定义属性在 Shlguid.h 中定义,该属性包含在 Windows SDK 中,并通过 IUIAutomationRegistrar::RegisterProperty 方法注册。 UI 自动化客户端使用 RegisterProperty 检索自定义属性的属性标识符 (PROPERTYIDs) 。

获取对 Vitualized 项的引用

ItemsView 元素 (IItemContainerProvider 接口) 实现 ItemContainer 控件模式,该模式允许客户端获取虚拟化项 () 可见区域之外的项的UI 自动化元素。 ItemsView 允许客户端通过搜索 Name 和 Selection 属性来查找 ListItem 元素-尝试搜索任何其他属性将失败。

虚拟元素仅实现 VirtualizedItem 控件模式 (IVirtualizedItemProvider 接口) 。 由于虚拟化UI 自动化元素表示的项尚不存在,因此尝试获取元素的任何其他控件模式或属性将失败。

ListItem 和 Group 元素均已虚拟化,但只能从 ItemContainer 控件模式返回 ListItem 元素。 由于对 IUIAutomationItemContainerPattern::FindItemByProperty 方法的调用在 UI 线程上运行并阻塞,因此视图在 FindItemByProperty 返回之前不会响应,并且提供程序上的任何其他方法调用必须等到 FindItemByProperty 完成。 在某些情况下, FindItemByProperty 必须在返回之前处理整个数据集,这可能会占用大量资源。 将 NULL 指定为起始元素会导致 FindItemByProperty 从视图中的第一项开始搜索。

ItemsView 支持 FindItemByProperty 的以下属性:

  • 名称 (UIA_NamePropertyId) - 搜索名称与指定字符串完全匹配的第一个项。 该搜索不区分大小写。 不支持通配符或部分匹配。 如果指定 NULL 名称,则返回起始元素后的下一项。 指定 NULL 名称允许UI 自动化客户端枚举视图中的所有项;但是,不建议枚举所有项,因为这会导致实现视图中的所有项。
  • SelectionItem_IsSelected (UIA_SelectionItemIsSelectedPropertyId) - 搜索SelectionItem_IsSelected属性与指定值匹配的第一项。 指定 TRUE 可查找第一个选定项,指定 FALSE 以查找第一个非选定项。 枚举所有选定项时要小心,因为所选项目的数量可能非常大,尤其是在用户已选择所有项时。

在屏幕上滚动虚拟化项

在获取对虚拟化 (屏幕外) 项的 UI 自动化 元素的引用后,客户端可以使用 VirtualizedItem 控件模式的 IUIAutomationVirtualizeItemPattern::Realize 方法将项滚动到视图中。 实现项后,它可见,并且通常与 ListItem 元素关联的所有属性和控件模式都可供客户端使用。

只有 IUIAutomationItemContainerPattern::FindItemByProperty 方法获取的 ListItem 元素才会公开 VirtualizedItem 控件模式。 当屏幕元素在屏幕外滚动时,该元素将变为无效,客户端必须调用 FindItemByProperty 以获取屏幕外引用。

还可以通过使用 滚动 控件模式 (或使用滚动条) 将项移入和移出视图。 项和组在滚动到视图中时实现,在滚动到视图外时虚拟化。

使用虚拟化项