Memorizzazione nella cache dei client di automazione interfaccia utente

Aggiornamento: novembre 2007

In questo argomento vengono forniti cenni preliminari sulla memorizzazione nella cache di proprietà e pattern di controllo di automazione interfaccia utente. 

In automazione interfaccia utente per memorizzazione nella cache si intende la prelettura dei dati. In questo modo è possibile accedere ai dati senza ulteriori comunicazioni tra processi. La memorizzazione nella cache viene solitamente utilizzata dalle applicazioni client di automazione interfaccia utente per il recupero di massa di proprietà e pattern di controllo. Le informazioni vengono quindi recuperate dalla cache secondo necessità. L'applicazione aggiorna periodicamente la cache, in genere in risposta a eventi indicanti che si è verificata una modifica nell'interfaccia utente.

I vantaggi della memorizzazione nella cache sono più notevoli con i controlli Windows Presentation Foundation (WPF) e i controlli personalizzati che hanno provider di automazione interfaccia utente sul lato server. Sono invece meno evidenti quando si accede a provider sul lato client, ad esempio i provider predefiniti per i controlli Win32. 

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

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

È possibile memorizzare nella cache le proprietà di automazione interfaccia utente e pattern di controllo di un elemento.

Nel presente argomento sono contenute le seguenti sezioni.

In CacheRequest vengono specificate le opzioni seguenti per la memorizzazione nella cache.

Proprietà da memorizzare nella cache

È possibile specificare le proprietà da memorizzare nella cache effettuando una chiamata ad 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 effettuando una chiamata ad Add(AutomationPattern) per ogni pattern prima di attivare la richiesta. Quando un pattern viene memorizzato nella cache, ciò non si verifica automaticamente anche per le relative proprietà, che devono invece essere specificate utilizzando CacheRequest.Add.

Ambito e filtro della memorizzazione nella cache

È possibile specificare gli elementi le cui proprietà e i cui pattern si desidera memorizzare nella cache 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 Children e quindi si recupera un elemento AutomationElement, le proprietà e i pattern degli elementi figlio, ma non quelli dell'elemento stesso, vengono memorizzati nella cache. Per assicurarsi che anche l'elemento recuperato venga memorizzato nella cache, è necessario includere Element nella proprietà TreeScope. Non è possibile impostare l'ambito su Parent o Ancestors. È tuttavia possibile memorizzare nella cache un elemento padre contemporaneamente a un elemento figlio. Vedere Recupero di elementi figlio e padre memorizzati nella cache in questo argomento.

Il livello di memorizzazione nella cache dipende anche dalla proprietà CacheRequest.TreeFilter. Per impostazione predefinita, vengono memorizzati nella cache solo gli elementi che appaiono nellavisualizzazione controlli della struttura ad albero di automazione interfaccia utente. È tuttavia possibile modificare questa proprietà in modo da applicare la memorizzazione nella cache a tutti gli elementi o solo a quelli che appaiono nella visualizzazione contenuto.

Efficacia dei riferimenti agli elementi

Quando si recupera un elemento AutomationElement, per impostazione predefinita si ottiene accesso a tutte le proprietà e a tutti i pattern di tale elemento, inclusi quelli non memorizzati nella cache. Tuttavia, per migliorare l'efficienza è possibile specificare che il riferimento all'elemento riguarda solo i dati memorizzati nella cache, impostando la proprietà AutomationElementMode di CacheRequest su None. In questo caso, non si ha accesso alle proprietà e ai pattern non memorizzati nella cache degli elementi recuperati. In altri termini, non è possibile accedere alle proprietà tramite GetCurrentPropertyValue o alla proprietà Current di AutomationElement né ai pattern di controllo e non è possibile recuperare un pattern utilizzando GetCurrentPattern o TryGetCurrentPattern. Per i pattern memorizzati nella cache, è possibile chiamare metodi che recuperano proprietà di matrice, ad esempio SelectionPattern.SelectionPatternInformation.GetSelection, ma non quelli che eseguono azioni sul controllo, ad esempio InvokePattern.Invoke.

Un esempio di applicazione per cui potrebbero non essere necessari riferimenti completi agli oggetti è un'utilità di lettura dello schermo, che prelegge le proprietà Name e ControlType degli elementi in una finestra ma non richiede gli oggetti AutomationElement stessi.

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

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

Un'alternativa utile quando si desidera nidificare le richieste di memorizzazione nella cache consiste nell'effettuare una chiamata a Push. In questo modo la richiesta viene inserita in uno stack e viene attivata. La richiesta rimane attiva finché non viene rimossa dallo stack tramite Pop. La richiesta diventa temporaneamente inattiva se nello stack viene inserita un'altra richiesta. Solo la richiesta superiore nello stack è attiva.

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

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

Cached, così come Current, espone le singole proprietà come membri di una struttura. Non è tuttavia necessario recuperare questa struttura, ma è possibile accedere direttamente alle singole proprietà. Ad esempio, la proprietà Name può essere ottenuta da element.Cached.Name, dove element è AutomationElement.

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

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

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

Quando si recupera AutomationElement e si richiede la memorizzazione nella cache per i relativi elementi figlio tramite la proprietà TreeScope della richiesta, è in seguito possibile ottenere gli elementi figlio dalla proprietà CachedChildren dell'elemento recuperato.

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

Nota:

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

La cache è valida solo finché non si verificano modifiche in interfaccia utente. L'applicazione è responsabile dell'aggiornamento della cache, in genere in risposta a eventi.

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

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

Aggiunte alla community

Mostra: