Partilhar via


Armazenamento em cache em clientes de automação da interface do usuário

Nota

Esta documentação destina-se a desenvolvedores do .NET Framework que desejam usar as classes de automação da interface do usuário gerenciadas definidas no System.Windows.Automation namespace. Para obter as informações mais recentes sobre a automação da interface do usuário, consulte API de automação do Windows: automação da interface do usuário.

Este tópico apresenta o cache de propriedades e padrões de controle da Automação da Interface do Usuário.

Na Automação da Interface do Usuário, cache significa pré-busca de dados. Os dados podem então ser acedidos sem qualquer outra comunicação entre processos. O cache é normalmente usado por aplicativos cliente de Automação da Interface do Usuário para recuperar propriedades e controlar padrões em massa. As informações são então recuperadas do cache, conforme necessário. O aplicativo atualiza o cache periodicamente, geralmente em resposta a eventos que significam que algo na interface do usuário (UI) foi alterado.

Os benefícios do cache são mais percetíveis com controles do Windows Presentation Foundation (WPF) e controles personalizados que têm provedores de automação da interface do usuário do lado do servidor. Há menos benefício ao acessar provedores do lado do cliente, como os provedores padrão para controles Win32.

O cache ocorre quando o aplicativo ativa um CacheRequest e, em seguida, usa qualquer método ou propriedade que retorna um AutomationElement; por exemplo, FindFirst, FindAll. Os métodos da TreeWalker classe são uma exceção; o cache só é feito se a CacheRequest for especificado como um parâmetro (por exemplo, TreeWalker.GetFirstChild(AutomationElement, CacheRequest).

O cache também ocorre quando você se inscreve em um evento enquanto um CacheRequest está ativo. O AutomationElement passado para o manipulador de eventos como a origem de um evento contém as propriedades e padrões armazenados em cache especificados pelo arquivo .CacheRequest Quaisquer alterações feitas no CacheRequest depois de se inscrever no evento não terão efeito.

As propriedades de automação da interface do usuário e os padrões de controle de um elemento podem ser armazenados em cache.

Opções para armazenamento em cache

O CacheRequest especifica as seguintes opções para cache.

Propriedades para cache

Você pode especificar propriedades para armazenar em cache chamando Add(AutomationProperty) cada propriedade antes de ativar a solicitação.

Padrões de controle para cache

Você pode especificar padrões de controle para armazenar em cache chamando Add(AutomationPattern) para cada padrão antes de ativar a solicitação. Quando um padrão é armazenado em cache, suas propriedades não são automaticamente armazenadas em cache; Você deve especificar as propriedades que deseja armazenar em cache usando CacheRequest.Add.

Escopo e filtragem de cache

Você pode especificar os elementos cujas propriedades e padrões deseja armazenar em cache definindo a CacheRequest.TreeScope propriedade antes de ativar a solicitação. O escopo é relativo aos elementos que são recuperados enquanto a solicitação está ativa. Por exemplo, se você definir apenas Childrene, em seguida, recuperar um AutomationElement, as propriedades e padrões dos filhos desse elemento serão armazenados em cache, mas não os do elemento em si. Para garantir que o cache seja feito para o próprio elemento recuperado, você deve incluir Element na TreeScope propriedade. Não é possível definir o âmbito para Parent ou Ancestors. No entanto, um elemento pai pode ser armazenado em cache quando um elemento filho é armazenado em cache. Para obter mais informações, consulte Recuperando filhos e pais armazenados em cache.

A extensão do cache também é afetada pela CacheRequest.TreeFilter propriedade. Por padrão, o cache é executado somente para elementos que aparecem na exibição de controle da árvore de Automação da Interface do Usuário. No entanto, você pode alterar essa propriedade para aplicar o cache a todos os elementos ou apenas aos elementos que aparecem na exibição de conteúdo.

Força das referências de elementos

Ao recuperar um AutomationElement, por padrão, você tem acesso a todas as propriedades e padrões desse elemento, incluindo aqueles que não foram armazenados em cache. No entanto, para maior eficiência, você pode especificar que a referência ao elemento se refere apenas aos dados armazenados em cache, definindo a AutomationElementMode propriedade do CacheRequest como None. Nesse caso, você não tem acesso a quaisquer propriedades e padrões não armazenados em cache de elementos recuperados. Isso significa que você não pode acessar nenhuma propriedade através GetCurrentPropertyValue de ou a Current propriedade de ou qualquer padrão de AutomationElement controle, nem pode recuperar um padrão usando GetCurrentPattern ou TryGetCurrentPattern. Em padrões armazenados em cache, você pode chamar métodos que recuperam propriedades de matriz, como SelectionPattern.SelectionPatternInformation.GetSelection, mas não qualquer um que execute ações no controle, como InvokePattern.Invoke.

Um exemplo de um aplicativo que pode não precisar de referências completas a objetos é um leitor de tela, que pré-buscaria as Name propriedades e ControlType dos elementos em uma janela, mas não precisaria dos AutomationElement próprios objetos.

Ativando o CacheRequest

O cache é executado somente quando AutomationElement os objetos são recuperados enquanto um CacheRequest está ativo para o thread atual. Há duas maneiras de ativar um CacheRequestarquivo .

A maneira habitual é ligar Activatepara . Esse método retorna um objeto que implementa IDisposable. A solicitação permanece ativa enquanto o IDisposable objeto existir. A maneira mais fácil de controlar o tempo de vida do objeto é incluir a chamada dentro de um using bloco (C#) ou Using (Visual Basic). Isso garante que a solicitação será exibida da pilha, mesmo que uma exceção seja gerada.

Outra maneira, que é útil quando você deseja aninhar solicitações de cache, é chamar Push. Isso coloca a solicitação em uma pilha e a ativa. A solicitação permanece ativa até ser removida da pilha pelo Pop. A solicitação torna-se temporariamente inativa se outra solicitação for empurrada para a pilha; apenas a solicitação superior na pilha está ativa.

Recuperando propriedades armazenadas em cache

Você pode recuperar as propriedades armazenadas em cache de um elemento por meio dos seguintes métodos e propriedades.

Uma exceção será gerada se a propriedade solicitada não estiver no cache.

Cached, como Current, expõe propriedades individuais como membros de uma estrutura. No entanto, você não precisa recuperar essa estrutura; Você pode acessar as propriedades individuais diretamente. Por exemplo, a Name propriedade pode ser obtida de element.Cached.Name, onde element é um AutomationElementarquivo .

Recuperando padrões de controle em cache

Você pode recuperar os padrões de controle armazenados em cache de um elemento através dos seguintes métodos.

Se o padrão não estiver no cache, GetCachedPattern gerará uma exceção e TryGetCachedPattern retornará false.

Você pode recuperar as propriedades armazenadas em cache de um padrão de controle usando a Cached propriedade do objeto pattern. Você também pode recuperar os valores atuais por meio da Current propriedade, mas somente se None não tiver sido especificado quando o AutomationElement foi recuperado. Full( é o valor padrão e isso permite o acesso aos valores atuais.)

Recuperando crianças e pais armazenados em cache

Quando você recupera um AutomationElement cache e solicitação para filhos desse elemento por meio TreeScope da propriedade da solicitação, é subsequentemente possível obter os elementos filho da CachedChildren propriedade do elemento recuperado.

Se Element tiver sido incluído no escopo da solicitação de cache, o elemento raiz da solicitação estará subsequentemente disponível na CachedParent propriedade de qualquer um dos elementos filho.

Nota

Não é possível armazenar em cache pais ou antepassados do elemento raiz da solicitação.

Atualizando o cache

O cache é válido apenas enquanto nada for alterado na interface do usuário. Seu aplicativo é responsável por atualizar o cache, geralmente em resposta a eventos.

Se você se inscrever em um evento enquanto estiver CacheRequest ativo, obterá um AutomationElement com um cache atualizado como a origem do evento sempre que o delegado do manipulador de eventos for chamado. Você também pode atualizar as informações armazenadas em cache de um elemento chamando GetUpdatedCache. Você pode passar o original CacheRequest para atualizar todas as informações que foram armazenadas anteriormente em cache.

A atualização do cache não altera as propriedades de nenhuma referência existente AutomationElement .

Consulte também