Armazenando em cache em clientes de automação de interface do usuário
Observação
Esta documentação destina-se a desenvolvedores de .NET Framework que querem usar as classes da Automação da Interface do Usuário gerenciadas definidas no namespace System.Windows.Automation. Para obter as informações mais recentes sobre a Automação da Interface do Usuário, confira API de Automação do Windows: Automação da 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 mais comunicação entre processos. O cache normalmente é usado por aplicativos cliente Automação da 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 manipulador de eventos passado como a origem de um evento contém as propriedades e padrões em cache especificados pelo original CacheRequest. Todas as alterações feitas após CacheRequest a assinatura do evento não têm efeito.
As propriedades 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
Especifica CacheRequest as seguintes opções de 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) cada padrão antes de ativar a solicitação. Quando um padrão é armazenado em cache, suas propriedades não são armazenadas automaticamente 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 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 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 elemento recuperado em si, você deve incluir Element na TreeScope propriedade. Não é possível definir o escopo como Parent ou Ancestors. Entretanto, um elemento pai pode ser armazenado em cache quando um elemento filho é armazenado em cache. Para obter mais informações, confira Recuperação de elementos 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 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 GetCurrentPropertyValue ou Current
propriedade de ou qualquer padrão de AutomationElement controle; nem você 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 propriedades e Name as ControlType propriedades 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 formas de acessar o CacheRequest.
A maneira usual é chamar Activate. 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 é colocar a chamada em 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 ficará temporariamente inativa se outra solicitação for enviada por push 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 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 Name propriedade pode ser obtida de element.Cached.Name
, onde element
é um AutomationElement.
Recuperando padrões de controle 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 foi AutomationElement recuperado. (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 tiver sido 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
Você não pode armazenar em cache pais ou ancestrais do elemento raiz da solicitação.
Atualizando o cache
O cache é válido somente 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.
A atualização do cache não altera as propriedades de nenhuma referência existente AutomationElement.