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


Кэширование в клиентах автоматизации пользовательского интерфейса

Замечание

Эта документация предназначена для разработчиков .NET Framework, которые хотят использовать управляемые классы автоматизации пользовательского интерфейса, определенные в пространстве имен System.Windows.Automation. Последние сведения об автоматизации пользовательского интерфейса см. в разделе API автоматизации Windows: автоматизация пользовательского интерфейса.

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

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

Преимущества кэширования особенно заметны при использовании элементов управления Windows Presentation Foundation (WPF) и пользовательских элементов управления, которые имеют серверные провайдеры автоматизации пользовательского интерфейса. При доступе к поставщикам на стороне клиента, например поставщикам по умолчанию для элементов управления Win32, меньше преимуществ.

Кэширование происходит, когда приложение активирует CacheRequest и затем использует любой метод или свойство, возвращающее AutomationElement; например, FindFirst, FindAll. Методы TreeWalker класса являются исключением. Кэширование выполняется только в том случае, если CacheRequest задан в качестве параметра (например, TreeWalker.GetFirstChild(AutomationElement, CacheRequest)).

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

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

Параметры кэширования

CacheRequest указывает следующие параметры для кэширования.

Свойства, которые нужно кэшировать

Вы можете указать свойства для кэширования, вызвав Add(AutomationProperty) для каждого свойства перед активацией запроса.

Шаблоны управления для кэширования

Вы можете указать шаблоны элементов управления для кэширования, вызвав Add(AutomationPattern) для каждого шаблона перед активацией запроса. Если шаблон кэшируется, его свойства не кэшируются автоматически; Необходимо указать свойства, которые требуется кэшировать с помощью CacheRequest.Add.

Область и фильтрация кэширования

Вы можете указать элементы, свойства и шаблоны которых необходимо кэшировать, задав CacheRequest.TreeScope свойство перед активацией запроса. Область определяется в отношении элементов, извлекаемых во время активного запроса. Например, если задано только Children, а затем извлекаются AutomationElement, свойства и шаблоны дочерних элементов этого элемента кэшируются, но свойства и шаблоны самого элемента не кэшируются. Чтобы обеспечить кэширование самого извлеченного элемента, необходимо добавить Element в свойство TreeScope. Невозможно установить область на Parent или Ancestors. Однако родительский элемент можно кэшировать при кэшировании дочернего элемента. Дополнительные сведения см. в разделе "Получение кэшированных детей и родителей".

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

Сила ссылок на элементы

При получении AutomationElement, по умолчанию у вас есть доступ ко всем свойствам и шаблонам этого элемента, включая те, которые не были кэшированы. Однако для повышения эффективности можно указать, что ссылка на элемент ссылается только на кэшированные данные, задав свойству AutomationElementMode объекта значение CacheRequest. В этом случае у вас нет доступа к не кэшируемым свойствам и шаблонам извлеченных элементов. Это означает, что вы не можете получить доступ к каким-либо свойствам через GetCurrentPropertyValue или через свойство Current элемента AutomationElement или какого-либо шаблона управления; также вы не можете получить шаблон с помощью GetCurrentPattern или TryGetCurrentPattern. В кэшированных шаблонах можно вызывать методы, которые извлекают свойства массива, такие как SelectionPattern.SelectionPatternInformation.GetSelection, но не те, которые выполняют действия в элементе управления, например InvokePattern.Invoke.

Пример приложения, которое может не нуждаться в полных ссылках на объекты, — средство чтения с экрана, которое будет предварительно получить Name и ControlType свойства элементов в окне, но не потребует AutomationElement самих объектов.

Активация CacheRequest

Кэширование выполняется только тогда, когда объекты AutomationElement извлекаются, и CacheRequest активен для текущего потока. Активировать объект CacheRequestможно двумя способами.

Обычный способ — вызвать Activate. Этот метод возвращает объект, реализующий IDisposable. Запрос остается активным до тех пор, пока IDisposable объект существует. Самый простой способ управления временем существования объекта — заключить вызов в using блок (C#) или Using (Visual Basic). Это гарантирует, что запрос будет извлечен из стека, даже если возникает исключение.

Другой способ, который полезен, если вы хотите вложить запросы кэша, — вызвать Push. Это помещает запрос в стек и активирует его. Запрос остается активным, пока он не будет удален из стека Pop. Запрос становится временно неактивным, если другой запрос отправляется в стек; Активен только верхний запрос в стеке.

Получение кэшированных свойств

Вы можете получить кэшированные свойства элемента с помощью следующих методов и свойств.

Исключение возникает, если запрошенное свойство не находится в кэше.

Cached, как Current, предоставляет отдельные свойства как члены структуры. Однако не требуется извлекать эту структуру; вы можете напрямую получить доступ к отдельным свойствам. Например, Name свойство можно получить из element.Cached.Name, где element является AutomationElement.

Получение кэшированных шаблонов управления

Вы можете получить кэшированные паттерны управления элемента через следующие методы.

Если шаблон не находится в кэше, GetCachedPattern вызывает исключение и TryGetCachedPattern возвращается false.

Вы можете получить кэшированные свойства шаблона элемента управления с помощью Cached свойства объекта шаблона. Можно также получить текущие значения через свойство Current, но только если None не был указан при извлечении AutomationElement. (Full является значением по умолчанию, и это позволяет получить доступ к текущим значениям.)

Получение кэшированных детей и родителей

При извлечении AutomationElement и запросе на кэширование дочерних элементов этого элемента через свойство TreeScope запроса, впоследствии можно получить эти дочерние элементы из свойства CachedChildren полученного элемента.

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

Замечание

Вы не можете кэшировать родителей или предков корневого элемента запроса.

Обновление кэша

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

Если вы подписываетесь на событие, когда CacheRequest активен, вы получаете AutomationElement с обновленным кэшом в качестве источника события всякий раз, когда вызывается делегат обработчика событий. Вы также можете обновить кэшированные сведения для элемента путем вызова GetUpdatedCache. Вы можете передать исходный CacheRequest код для обновления всех сведений, которые ранее кэшировались.

Обновление кэша не изменяет свойства существующих AutomationElement ссылок.

См. также