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

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

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

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

схема, показывающая элементы в списке, которые виртуализированы и не виртуализированы

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

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

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

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

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

Правила и соглашения реализации

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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