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

Примечание.

Эта документация предназначена для разработчиков .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 значение None. В этом случае вы не будете иметь доступ к тем свойствам и шаблонам извлеченного элемента, которые не были кэшированы. Это означает, что вы не сможете получить доступ к каким-либо свойствам с помощью 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, где elementAutomationElement.

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

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

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

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

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

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

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

Примечание.

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

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

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

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

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

См. также