Memorizzazione nella cache dei client di automazione interfaccia utente

Nota

Questa documentazione è destinata agli sviluppatori .NET Framework che desiderano utilizzare le classi di Automazione interfaccia utente gestite definite nello spazio dei nomi System.Windows.Automation. Per informazioni aggiornate su Automazione interfaccia utente, vedere API di automazione di Windows: Automazione interfaccia utente.

Questo argomento presenta la memorizzazione nella cache delle proprietà di Automazione interfaccia utente e dei criteri di controllo.

In Automazione interfaccia utente la memorizzazione nella cache significa recupero preliminare dei dati. I dati diventano quindi accessibili senza un'ulteriore comunicazione tra processi. La memorizzazione nella cache in genere viene usata dalle applicazioni client di automazione interfaccia utente per recuperare in massa proprietà e pattern di controllo. Le informazioni vengono quindi recuperate dalla cache in base alle necessità. L'applicazione aggiorna periodicamente la cache, in genere come risposta a eventi indicanti che nell’interfaccia utente è cambiato qualcosa.

I vantaggi della memorizzazione nella cache sono più evidenti con i controlli Windows Presentation Foundation (WPF) e con i controlli personalizzati che dispongono di provider di automazione interfaccia utente lato server. Il vantaggio è minore quando si accede ai provider lato client, ad esempio i provider predefiniti per i controlli Win32.

La memorizzazione nella cache si verifica quando l'applicazione attiva un elemento CacheRequest e quindi usa un metodo o una proprietà che restituisce un elemento AutomationElement, ad esempio FindFirst, FindAll. I metodi della classe TreeWalker sono un'eccezione. La memorizzazione nella cache viene eseguita solo se un elemento CacheRequest viene specificato come parametro (ad esempio, TreeWalker.GetFirstChild(AutomationElement, CacheRequest).

La memorizzazione nella cache viene eseguita anche quando si sottoscrive un evento mentre è attivo un elemento CacheRequest . L'elemento AutomationElement passato al gestore eventi come origine di un evento contiene le proprietà e i pattern memorizzati nella cache specificati dall'elemento CacheRequestoriginale. Eventuali modifiche apportate all'elemento CacheRequest dopo la sottoscrizione dell'evento non vengono applicate.

Le proprietà di Automazione interfaccia utente e i criteri di controllo di un elemento possono essere memorizzati nella cache.

Opzioni per la memorizzazione nella cache

CacheRequest specifica le opzioni seguenti per la memorizzazione nella cache.

Proprietà da memorizzare nella cache

È possibile specificare le proprietà da memorizzare nella cache chiamando Add(AutomationProperty) per ogni proprietà prima di attivare la richiesta.

Pattern di controllo da memorizzare nella cache

È possibile specificare i pattern di controllo da memorizzare nella cache chiamando Add(AutomationPattern) per ogni pattern prima di attivare la richiesta. Quando un pattern viene memorizzato nella cache, non vengono automaticamente memorizzate anche le proprietà. È necessario specificare le proprietà che si vuole memorizzare nella cache usando CacheRequest.Add.

Ambito e applicazione di filtri per la memorizzazione nella cache

È possibile specificare gli elementi di cui si vuole memorizzare nella cache le proprietà e i pattern impostando la proprietà CacheRequest.TreeScope prima di attivare la richiesta. L'ambito è relativo agli elementi recuperati mentre la richiesta è attiva. Se, ad esempio, si imposta solo Childrene quindi si recupera AutomationElement, le proprietà e i pattern dei figli di tale elemento vengono memorizzati nella cache, ma non quelli dell'elemento stesso. Per assicurarsi che la memorizzazione nella cache venga eseguita proprio per l'elemento recuperato, è necessario includere Element nella proprietà TreeScope . Non è possibile impostare l'ambito su Parent o Ancestors. Tuttavia, un elemento padre può essere memorizzato nella cache quando un elemento figlio viene memorizzato nella cache. Per altre informazioni, vedere Recupero di elementi figlio e padre memorizzati nella cache.

L'ambito della memorizzazione nella cache è interessato anche dalla proprietà CacheRequest.TreeFilter . Per impostazione predefinita, la memorizzazione nella cache viene eseguita solo per gli elementi presenti nella vista controllo dell'albero di Automazione interfaccia utente. È possibile, tuttavia, modificare questa proprietà per poter applicare la memorizzazione nella cache a tutti gli elementi o solo agli elementi presenti nella visualizzazione contenuto.

Efficacia dei riferimenti a un elemento

Quando si recupera un oggetto AutomationElement, per impostazione predefinita si ha accesso a tutte le proprietà e i pattern di tale elemento, inclusi quelli non memorizzati nella cache. Per una maggiore efficienza, tuttavia, è possibile specificare che il riferimento all'elemento si riferisce solo ai dati memorizzati nella cache, impostando la proprietà AutomationElementMode di CacheRequest su None. In questo caso, non si ha accesso a tutte le proprietà e i pattern non memorizzati nella cache degli elementi recuperati. Non è quindi possibile accedere alle proprietà con GetCurrentPropertyValue o con la proprietà Current di AutomationElement o di un pattern di controllo né è possibile recuperare un pattern usando GetCurrentPattern o TryGetCurrentPattern. Per i pattern memorizzati nella cache è possibile chiamare metodi che recuperano proprietà di matrici, ad esempio SelectionPattern.SelectionPatternInformation.GetSelection, ma nessuno che esegue azioni sul controllo, ad esempio InvokePattern.Invoke.

Un esempio di applicazione che non necessariamente ha bisogno di riferimenti completi agli oggetti è un'utilità per la lettura dello schermo, che esegue una prelettura delle proprietà Name e ControlType degli elementi di una finestra, ma non richiede gli oggetti AutomationElement stessi.

Attivazione di CacheRequest

La memorizzazione nella cache viene eseguita solo quando gli oggetti AutomationElement vengono recuperati mentre un oggetto CacheRequest è attivo per il thread corrente. Esistono due diverse modi per attivare un oggetto CacheRequest.

Il modo consueto consiste nel chiamare Activate. Questo metodo restituisce un oggetto che implementa IDisposable. La richiesta rimane attiva finché esiste l'oggetto IDisposable . Il modo più facile per controllare la durata dell'oggetto consiste nel racchiudere la chiamata in un blocco using (C#) o Using (Visual Basic). In questo modo la richiesta verrà sicuramente estratta dallo stack anche se verrà generata un'eccezione.

Un altro modo, utile quando si vuole annidare le richieste della cache, consiste nel chiamare Push, che inserisce la richiesta in uno stack e la attiva. La richiesta rimane attiva finché viene rimossa dallo stack da Pop. La richiesta diventa temporaneamente inattiva se viene effettuato il push di un'altra richiesta nello stack. Solo la richiesta principale dello stack è attiva.

Recupero di proprietà memorizzate nella cache

È possibile recuperare le proprietà memorizzate nella cache di un elemento con i metodi e le proprietà seguenti.

Se la proprietà richiesta non è nella cache, viene generata un'eccezione.

Cached, come Current, espone le singole proprietà come membri di una struttura che tuttavia non è necessario recuperare perché è possibile accedere direttamente alle singole proprietà. La proprietà Name , ad esempio, può essere ottenuta da element.Cached.Name, dove element è un oggetto AutomationElement.

Recupero di pattern di controllo memorizzati nella cache

È possibile recuperare i pattern di controllo memorizzati nella cache di un elemento con i metodi seguenti.

Se il pattern non è nella cache, GetCachedPattern genera un'eccezione e TryGetCachedPattern restituisce false.

È possibile recuperare le proprietà memorizzate nella cache di un pattern di controllo usando la proprietà Cached dell'oggetto pattern. È anche possibile recuperare i valori correnti con la proprietà Current , ma solo se non è stato specificato None quando è stato recuperato l'oggetto AutomationElement . Full è il valore predefinito, che consente l'accesso ai valori correnti.

Recupero di elementi figlio e padre memorizzati nella cache

Quando si recupera un oggetto AutomationElement e si richiede la memorizzazione nella cache per i figli di tale elemento con la proprietà TreeScope della richiesta, successivamente è possibile ottenere gli elementi figlio dalla proprietà CachedChildren dell'elemento recuperato.

Se Element è stato incluso nell'ambito della richiesta della cache, l'elemento radice della richiesta è successivamente disponibile nella proprietà CachedParent di qualsiasi elemento figlio.

Nota

Non è possibile memorizzare nella cache elementi padre o predecessori dell'elemento radice della richiesta.

Aggiornamento della cache

La cache è valida solo finché non vengono apportate modifiche all’interfaccia utente. L'applicazione è responsabile dell'aggiornamento della cache, di solito come risposta a un evento.

Se si sottoscrive un evento mentre è attivo un oggetto CacheRequest , si ottiene un AutomationElement con una cache aggiornata come origine dell'evento quando viene chiamato il delegato del gestore eventi. È anche possibile aggiornare le informazioni memorizzate nella cache per un elemento chiamando GetUpdatedCache. È possibile passare l'oggetto CacheRequest originale per aggiornare tutte le informazioni memorizzate in precedenza nella cache.

L'aggiornamento della cache non modifica le proprietà dei riferimenti a AutomationElement esistenti.

Vedi anche