Поделиться через


Шаблон элемента управления ItemContainer

Описывает рекомендации и соглашения для реализации IItemContainerProviderProvider, включая сведения о методах. Шаблон элемента управления ItemContainer используется для поддержки виртуализации элементов.

Элементы управления, содержащие большое количество дочерних элементов, могут использовать виртуализацию для эффективного управления элементами. При виртуализации элемент управления сохраняет полную информацию в памяти только для подмножества элементов в любое время. Как правило, подмножество включает только те элементы, которые в настоящее время видны пользователю. Полная информация о оставшихся виртуализированных элементах хранится в хранилище и загружается в память или реализуется, так как элемент управления нуждается в нем, например, когда новые элементы становятся видимыми для пользователя.

Например, на следующей схеме показан список, содержащий тысячи виртуализированных элементов. Поскольку элемент управления сохраняет полную информацию только для дочерних элементов, которые в настоящее время видимы, поставщик может предоставлять элементы службы автоматизации пользовательского интерфейса Майкрософт только для элементов 100–127.

диаграмме с элементами в списке, которые виртуализированы и не виртуализированы

Элементы управления, использующие виртуализацию, представляют проблему, так как в дереве автоматизации пользовательского интерфейса полностью доступны только элементы автоматизации пользовательского интерфейса (де-виртуализированные). Виртуализированные элементы не существуют в дереве, поэтому сведения о них недоступны.

Чтобы предоставить сведения о виртуализированных элементах, поставщики реализуют шаблон управления ItemContainer ItemContainer, который предоставляет интерфейсIItemContainerProvider. Метод FindItemByProperty находит дочерние элементы на основе значения определенного свойства, например Name, AutomationIdили IsSelected. Если элемент виртуализирован, FindItemByProperty извлекает элемент заполнителя службы автоматизации пользовательского интерфейса для элемента. Элемент заполнителя — это реализация интерфейса IRawElementProviderSimple, который поддерживает только шаблон элемента управления VirtualizedItem.

Метод IVirtualizedItemProvider::Realize позволяет клиенту запрашивать, чтобы виртуализированный элемент был реализован, тем самым предоставляя полный элемент автоматизации пользовательского интерфейса для элемента, чтобы все необходимые свойства и шаблоны были доступны.

Хотя основной целью шаблона элемента управления ItemContainer является поддержка виртуализированных сценариев контейнеров, он может быть реализован любым контейнером, который получает дочерние элементы по имени, независимо от того, используется ли контейнер виртуализации.

В этом разделе содержатся следующие разделы.

Рекомендации по реализации и соглашения

При реализации шаблона элемента управления ItemContainer обратите внимание на следующие рекомендации и соглашения:

  • Любой элемент управления, который может содержать виртуализированные элементы, должен поддерживать шаблон элемента управления ItemContainer. Любой контейнер, поддерживающий извлечение элементов на основе значения свойства, может поддерживать этот шаблон независимо от того, использует ли контейнер виртуализацию.
  • Если контейнер виртуализирован, другие шаблоны элементов управления, такие как выбора, таблицаи сетки могут быть затронуты. Например, метод ISelectionProvider::GetSelection может поддерживать только элементы, находящиеся в режиме просмотра, или только выбранные элементы, которые в настоящее время не виртуализированы.
  • Шаблон элемента управления прокрутки не должен быть затронут виртуализацией.
  • Для виртуализированных элементов нет сведений о количестве элементов или индексе. При необходимости виртуализированный элемент управления может использовать DescribedBy или свойство ItemStatus.
  • Разработчики управления должны документировать и публиковать сведения обо всех свойствах и шаблонах управления пользовательского интерфейса, затронутых использованием виртуализации. Хотя шаблоны элементов управления ItemContainer и VirtualizedItem поддерживают базовую поддержку, они могут не поддерживать некоторые поведения виртуализации.

Следующие рекомендации и требования применяются к методу IItemContainerProvider::FindItemByProperty.

  • Хотя это не обязательно, корпорация Майкрософт настоятельно рекомендует FindItemByProperty поддерживать свойства имени, AutomationIdи IsSelected.
  • FindItemByProperty может быть медленным, если он должен пройти по нескольким объектам, чтобы найти соответствующий.
  • FindItemByProperty можно вызывать многократно, чтобы найти элементы в последовательности. Элементы могут находиться в любом порядке, если каждый элемент возвращается только один раз.
  • FindItemByProperty можно реализовать, чтобы найти только те элементы, которые отображаются в представлении элементов управления или содержимого дерева автоматизации пользовательского интерфейса. Элементы, которые отображаются только в необработанном представлении, можно пропускать, чтобы избежать извлечения нескольких элементов, представляющих только часть элемента пользователя.
  • Если критерии поиска соответствуют виртуализированному элементу, поставщик может вернуть элемент заполнителя, поддерживающий шаблон элемента управления VirtualizedItem. Следующие рекомендации применяются к элементам заполнителей:
    • Получение заполнителя для виртуализированного элемента не должно привести к изменению пользовательского интерфейса.
    • Элемент заполнителя должен быть одноранговым элементом других дочерних элементов (требуется событие изменения структуры).
    • По возможности поставщик может создать полный элемент автоматизации вместо заполнителя.
  • Если критерии поиска соответствуют неиртуализированному элементу, поставщик должен возвращать фактический элемент, а не заполнитель.
  • Если элемент не найден, IItemContainerProvider::FindItemByProperty должен задать параметр pFound значением NULL и возвращать S_OK.
  • Если параметр свойства равен 0, поставщик должен вернуть следующий элемент после pStartAfter.
  • Если параметр pStartAfternull и propertyId равен 0, поставщик должен вернуть первый элемент в контейнере.
  • Если параметр propertyId равен 0, параметр значения игнорируется.

Следующие рекомендации и требования применяются к элементам заполнителей для виртуализированных элементов в дереве автоматизации пользовательского интерфейса.

  • Хотя поставщики рекомендуется поддерживать дополнительные свойства и шаблоны элементов управления для элемента заполнителя, требуется только шаблон VirtualizedItem.
  • Поставщик может отменить предыдущий элемент заполнителя при вызове IItemContainerProvider::FindItemByProperty. (Если клиент должен реализовать элемент заполнителя, он должен сделать это немедленно; в противном случае элемент может быть недействительным, если FindItemByProperty вызывается снова или если окно просмотра изменяется по какой-либо причине.)
  • Действия пользовательского интерфейса, такие как прокрутка или изменение размера, могут привести к изменению окна просмотра контейнера, а новый набор дочерних элементов становится видимым. В этом случае ранее извлеченные элементы заполнителя могут быть недоступны в дереве автоматизации пользовательского интерфейса.
  • Поставщик не должен виртуализировать элементы пользовательского интерфейса, доступные на экране в режиме объекта контейнера.

Обязательные элементы для IItemContainerProvider

Для реализации интерфейса IItemContainerProvider требуется следующий метод.

Обязательные элементы Тип элемента Примечания
FindItemByProperty Метод Никакой

 

Шаблон элемента управления ItemContainer не имеет связанных свойств или событий.

Типы элементов управления и поддерживаемые шаблоны элементов управления

Обзор шаблонов элементов управления автоматизации пользовательского интерфейса

Обзор дерева автоматизации пользовательского интерфейса

шаблон элемента управления VirtualizedItem