Compartilhar via


Cache em clientes de automação da interface de usuário

Observação

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

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

Em Automação da Interface do Usuário, o cache significa a pré-busca de dados. Em seguida, os dados podem ser acessados sem comunicação entre processos adicionais. O cache normalmente é usado por aplicativos cliente da Automação de Interface do Usuário para recuperar propriedades e padrões de controle em massa. Em seguida, as informações sã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 (interface do usuário) foi alterado.

Os benefícios do cache são mais perceptíveis com controles de 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ó será feito se um CacheRequest for especificado como um parâmetro (por exemplo, TreeWalker.GetFirstChild(AutomationElement, CacheRequest).

O cache também ocorre quando você assina um evento enquanto um CacheRequest está ativo. O AutomationElement passado para o seu manipulador de eventos como fonte de um evento contém as propriedades e padrões em cache especificados pelo original CacheRequest. Quaisquer alterações feitas no CacheRequest após a inscrição no evento não têm efeito.

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

Opções de cache

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

Propriedades para Cache

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

Padrões de controle para cache

Você pode especificar padrões de controle a serem armazenados 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 armazenadas em cache automaticamente; você deve especificar as propriedades desejadas armazenadas em cache usando CacheRequest.Add.

Escopo e filtragem de cache

Você pode especificar os elementos cujas propriedades e padrões você deseja armazenar em cache definindo a CacheRequest.TreeScope propriedade antes de ativar a solicitação. O escopo é relativo aos elementos recuperados enquanto a solicitação está ativa. Por exemplo, se você definir apenas Childrene recuperar um AutomationElement, as propriedades e os padrões de 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 elemento recuperado em si, você deve incluir Element na TreeScope propriedade. Não é possível definir o escopo para Parent ou Ancestors. Entretanto, 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 apenas 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 no modo de exibição de conteúdo.

Força das referências de elemento

Quando você recupera 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 somente a dados armazenados em cache, definindo a propriedade AutomationElementMode de CacheRequest como None. Nesse caso, você não tem acesso a nenhuma propriedade não armazenada em cache e padrões de elementos recuperados. Isso significa que você não pode acessar nenhuma propriedade por meio de GetCurrentPropertyValue ou pela propriedade Current de AutomationElement, nem de qualquer padrão de 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 e ControlType propriedades dos elementos em uma janela, mas não precisaria dos próprios AutomationElement 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 CacheRequest.

A maneira usual é chamar Activate. Esse método retorna um objeto que implementa IDisposable. A solicitação permanece ativa desde que o IDisposable objeto exista. A maneira mais fácil de controlar o tempo de vida do objeto é colocar a chamada dentro de um using bloco (C#) ou Using (Visual Basic). Isso garante que a solicitação seja exibida da pilha mesmo se uma exceção for 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 por Pop. A solicitação se torna temporariamente inativa se outra solicitação for inserida na pilha; apenas a última solicitação na pilha está ativa.

Recuperando propriedades armazenadas em cache

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

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 propriedade Name pode ser obtida de element.Cached.Name, onde element é um AutomationElement.

Recuperando padrões de controle armazenados em cache

Você pode recuperar os padrões de controle armazenados em cache de um elemento por meio dos métodos a seguir.

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 padrão. Você também pode recuperar os valores atuais por meio da Current propriedade, mas somente se None não tiver sido especificado quando a AutomationElement propriedade foi recuperada. (Full é o valor padrão, e isso permite o acesso aos valores atuais.)

Recuperando filhos e pais armazenados em cache

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

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

Observação

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

Atualizando o cache

O cache é válido apenas desde que nada seja alterado na interface do usuário. Seu aplicativo é responsável por atualizar o cache, normalmente em resposta a eventos.

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

Atualizar o cache não altera as propriedades de nenhuma referência existente AutomationElement .

Consulte também