使用虚拟化项

本主题介绍如何使用 ItemContainerVirtualizedItem 控件模式提供的功能来查找和检索有关虚拟化项的信息。

虚拟化概述

包含大量子项的控件可以使用虚拟化有效地管理项。 借助虚拟化,控件在任何给定时间仅保留一部分项的内存中的完整信息。 通常,子集仅包括用户当前可见的那些项。 有关剩余虚拟化项的完整信息保存在存储中,并加载到内存中,或者当控件需要时(例如,当用户看到新项时),就会实现该信息。

使用虚拟化的控件是一项挑战,因为只有已实现的项在UI 自动化树中作为 Microsoft UI 自动化 元素完全可用。 虚拟化项不存在于树中,因此客户端无法获取有关这些项的信息。 若要检索有关虚拟化项的信息,客户端需要一种方法来强制UI 自动化将实现项的请求传递给控件。 实现项后,UI 自动化可以为它们创建UI 自动化元素。 UI 自动化包括两种控制模式,使客户端能够使用虚拟化项:ItemContainerVirtualizedItem

控件如何支持虚拟化

任何可以包含虚拟化项的控件都必须支持 ItemContainer 控件模式。 此外,任何可虚拟化的项都必须支持 VirtualizedItem 控件模式。 客户端可通过 IUIAutomationItemContainerPatternIUIAutomationVirtualizedItemPattern 接口访问 ItemContainer 和 VirtualizedItem 控件 模式公开的功能。

客户端如何查找和实现虚拟化项

客户端可以使用 IUIAutomationItemContainerPattern::FindItemByProperty 方法根据特定属性的值搜索容器中的子项。 方法还可以检索容器中的第一项或指定项后面的项。 如果找到匹配的子项, FindItemByProperty 将检索该项的 IUIAutomationElement 接口。 但是,如果子项已虚拟化, 则 IUIAutomationElement 接口为占位符。 当客户端尝试使用 IUIAutomationElement 接口检索属性值或调用尚不可用的方法时,会发生UIA_E_ELEMENTNOTAVAILABLE错误。 哪些属性或方法可通过占位符使用取决于控件实现。 占位符的唯一要求是支持 IUIAutomationVirtualizedItemPattern 接口。

UIA_E_ELEMENTNOTAVAILABLE错误指示客户端可能会虚拟化某个项。 客户端应通过以下方式做出响应:检索项的 IUIAutomationVirtualizedItemPattern 接口,然后通过调用 IUIAutomationVirtualizedItemPattern::Realize 方法实现该项。 如果此操作成功, IUIAutomationElement 接口将完全正常运行,并具有所有可用的适当属性。

根据控件实现,调用 IUIAutomationVirtualizedItemPattern::Realize 可能会导致控件将项滚动到视图中。 但是,客户端不应依赖于滚动到视图中或变为可见的项。 若要确保项可见,客户端可以使用 IUIAutomationScrollItemPattern::ScrollIntoView 方法。

示例

有关演示如何使用UI 自动化虚拟化支持的示例代码,请参阅如何检索虚拟化项

UI 自动化控件模式概述