Cachelagring i UI Automation-klienter
Kommentar
Den här dokumentationen System.Windows.Automation är avsedd för .NET Framework-utvecklare som vill använda de hanterade UI Automation-klasserna som definierats i namnområdet. Den senaste informationen om UI Automation finns i Windows Automation API: UI Automation.
Det här avsnittet beskriver cachelagring av egenskaper och kontrollmönster för gränssnittsautomatisering.
I UI Automation innebär cachelagring förhämtning av data. Data kan sedan nås utan ytterligare kommunikation mellan processer. Cachelagring används vanligtvis av UI Automation-klientprogram för att hämta egenskaper och kontrollmönster i bulk. Informationen hämtas sedan från cachen efter behov. Programmet uppdaterar cachen regelbundet, vanligtvis som svar på händelser som innebär att något i användargränssnittet (UI) har ändrats.
Fördelarna med cachelagring är mest märkbara med WPF-kontroller (Windows Presentation Foundation) och anpassade kontroller som har leverantörer av användargränssnittsautomatisering på serversidan. Det finns mindre fördelar vid åtkomst till leverantörer på klientsidan, till exempel standardprovidrar för Win32-kontroller.
Cachelagring inträffar när programmet aktiverar en CacheRequest och sedan använder en metod eller egenskap som returnerar en AutomationElement, till exempel FindFirst, FindAll. Metoderna för TreeWalker klassen är ett undantag. Cachelagring görs endast om en CacheRequest anges som en parameter (till exempel TreeWalker.GetFirstChild(AutomationElement, CacheRequest).
Cachelagring inträffar också när du prenumererar på en händelse medan en CacheRequest är aktiv. Den AutomationElement som skickas till händelsehanteraren som källa för en händelse innehåller de cachelagrade egenskaper och mönster som anges av den ursprungliga CacheRequest. Ändringar som görs i CacheRequest när du prenumererar på händelsen har ingen effekt.
UI Automation-egenskaperna och kontrollmönstren för ett element kan cachelagras.
Alternativ för Cachelagring
CacheRequest Anger följande alternativ för cachelagring.
Egenskaper till cache
Du kan ange egenskaper för cachelagring genom att anropa Add(AutomationProperty) för varje egenskap innan du aktiverar begäran.
Kontrollera mönster till cache
Du kan ange kontrollmönster som ska cachelagrats genom att anropa Add(AutomationPattern) för varje mönster innan du aktiverar begäran. När ett mönster cachelagras cachelagras inte dess egenskaper automatiskt. du måste ange de egenskaper som du vill cachelagras med hjälp CacheRequest.Addav .
Omfång och filtrering av Cachelagring
Du kan ange de element vars egenskaper och mönster du vill cachelagrar genom att ange CacheRequest.TreeScope egenskapen innan du aktiverar begäran. Omfånget är relativt till de element som hämtas medan begäran är aktiv. Om du till exempel bara Childrenanger och sedan hämtar egenskaperna AutomationElementoch mönstren för underordnade element cachelagras, men inte egenskaperna för själva elementet. För att säkerställa att cachelagringen görs för själva det hämtade elementet måste du inkludera Element i TreeScope egenskapen. Det går inte att ange omfånget till Parent eller Ancestors. Ett överordnat element kan dock cachelagras när ett underordnat element cachelagras. Mer information finns i Hämta cachelagrade underordnade och överordnade.
Cachelagringens omfattning påverkas också av CacheRequest.TreeFilter egenskapen. Som standard utförs cachelagring endast för element som visas i kontrollvyn för UI Automation-trädet. Du kan dock ändra den här egenskapen så att cachelagring tillämpas på alla element, eller bara på element som visas i innehållsvyn.
Styrkan i elementreferenserna
När du hämtar en AutomationElementhar du som standard åtkomst till alla egenskaper och mönster för elementet, inklusive de som inte cachelagrades. För större effektivitet kan du dock ange att referensen till elementet endast refererar till cachelagrade data genom att ange AutomationElementMode egenskapen CacheRequest för till None. I det här fallet har du inte åtkomst till några icke-cachelagrade egenskaper och mönster för hämtade element. Det innebär att du inte kan komma åt några egenskaper via GetCurrentPropertyValue eller Current
egenskapen AutomationElement för eller något kontrollmönster. Du kan inte heller hämta ett mönster med hjälp GetCurrentPattern av eller TryGetCurrentPattern. På cachelagrade mönster kan du anropa metoder som hämtar matrisegenskaper, till exempel SelectionPattern.SelectionPatternInformation.GetSelection, men inte några som utför åtgärder på kontrollen, till exempel InvokePattern.Invoke.
Ett exempel på ett program som kanske inte behöver fullständiga referenser till objekt är en skärmläsare, som skulle förinstallera Name egenskaperna och ControlType för elementen i ett fönster, men som inte skulle behöva själva objekten AutomationElement .
Aktivera CacheRequest
Cachelagring utförs endast när AutomationElement objekt hämtas medan en CacheRequest är aktiv för den aktuella tråden. Det finns två sätt att aktivera en CacheRequest.
Det vanliga sättet är att anropa Activate. Den här metoden returnerar ett objekt som implementerar IDisposable. Begäran förblir aktiv så länge objektet IDisposable finns. Det enklaste sättet att styra objektets livslängd är att omsluta anropet inom ett using
(C#) eller Using
(Visual Basic)-block. Detta säkerställer att begäran kommer att poppas från stacken även om ett undantag utlöses.
Ett annat sätt, som är användbart när du vill kapsla cachebegäranden, är att anropa Push. Detta placerar begäran på en stack och aktiverar den. Begäran förblir aktiv tills den tas bort från stacken av Pop. Begäran blir tillfälligt inaktiv om en annan begäran skickas till stacken. endast den översta begäran i stacken är aktiv.
Hämtar cachelagrade egenskaper
Du kan hämta cachelagrade egenskaper för ett element via följande metoder och egenskaper.
Ett undantag utlöses om den begärda egenskapen inte finns i cacheminnet.
Cached, till exempel Current, exponerar enskilda egenskaper som medlemmar i en struktur. Du behöver dock inte hämta den här strukturen. du kan komma åt de enskilda egenskaperna direkt. Egenskapen Name kan till exempel hämtas från element.Cached.Name
, där element
är en AutomationElement.
Hämtar cachelagrade kontrollmönster
Du kan hämta cachelagrade kontrollmönster för ett element med hjälp av följande metoder.
Om mönstret inte finns i cacheminnet GetCachedPattern genererar du ett undantag och TryGetCachedPattern returnerar false
.
Du kan hämta cachelagrade egenskaper för ett kontrollmönster med hjälp Cached
av egenskapen för mönsterobjektet. Du kan också hämta de aktuella värdena via Current
egenskapen, men bara om None det inte angavs när den AutomationElement hämtades. (Full är standardvärdet och tillåter åtkomst till de aktuella värdena.)
Hämta cachelagrade underordnade och överordnade
När du hämtar en AutomationElement cachelagring och en begäran om cachelagring för underordnade element via TreeScope egenskapen för begäran går det därefter att hämta underordnade element från CachedChildren egenskapen för det element som du hämtade.
Om Element den ingår i cachebegärans omfång är rotelementet i begäran senare tillgängligt från CachedParent egenskapen för något av de underordnade elementen.
Kommentar
Du kan inte cachelagrar överordnade eller överordnade till rotelementet i begäran.
Uppdatera cachen
Cachen är endast giltig så länge inget ändras i användargränssnittet. Ditt program ansvarar för att uppdatera cacheminnet, vanligtvis som svar på händelser.
Om du prenumererar på en händelse medan en CacheRequest är aktiv får du en AutomationElement med en uppdaterad cache som källa för händelsen när händelsehanterardelegaten anropas. Du kan också uppdatera cachelagrad information för ett element genom att anropa GetUpdatedCache. Du kan skicka in originalet CacheRequest för att uppdatera all information som tidigare cachelagrats.
Uppdatering av cacheminnet ändrar inte egenskaperna för befintliga AutomationElement referenser.