使用虚拟化项

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

虚拟化概述

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

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

控件如何支持虚拟化

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

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

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

UIA_E_ELEMENTNOTAVAILABLE错误指示客户端可能虚拟化某个项。 客户端应通过检索项的 IUIAutomationVirtualizedItemPattern 接口来响应,然后通过调用 IUIAutomationVirtualizedItemPattern::Realize 方法实现该项。 如果成功, 则 IUIAutomationElement 接口功能完全适用于所有可用的适当属性。

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

示例

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

UI 自动化控件模式概述