Práce s mezipamětí u klientů automatizace uživatelského rozhraní
Poznámka:
Tato dokumentace je určená pro vývojáře rozhraní .NET Framework, kteří chtějí používat spravované třídy model UI Automation definované v System.Windows.Automation oboru názvů. Nejnovější informace o model UI Automation najdete v tématu Rozhraní API služby Windows Automation: model UI Automation.
Toto téma představuje ukládání vlastností model UI Automation do mezipaměti a vzorů ovládacích prvků.
V model UI Automation ukládání do mezipaměti znamená předběžné načítání dat. K datům se pak dostanete bez další komunikace mezi procesy. Ukládání do mezipaměti obvykle používají klientské aplikace model UI Automation k hromadnému načítání vlastností a vzorů ovládacích prvků. Informace se pak podle potřeby načtou z mezipaměti. Aplikace pravidelně aktualizuje mezipaměť, obvykle v reakci na události, které značí, že se něco v uživatelském rozhraní změnilo.
Výhody ukládání do mezipaměti jsou nejvýraznější díky ovládacím prvkům Windows Presentation Foundation (WPF) a vlastním ovládacím prvkům, které mají poskytovatele model UI Automation na straně serveru. Při přístupu k poskytovatelům na straně klienta, jako jsou výchozí zprostředkovatelé pro ovládací prvky Win32, je méně výhod.
Ukládání do mezipaměti nastane, když aplikace aktivuje a pak použije libovolnou CacheRequest metodu nebo vlastnost, která vrací AutomationElement, například FindFirst, FindAll. Metody TreeWalker třídy jsou výjimka; ukládání do mezipaměti se provádí pouze v případě CacheRequest , že je zadán jako parametr (například TreeWalker.GetFirstChild(AutomationElement, CacheRequest).
Ukládání do mezipaměti také dojde, když se přihlásíte k odběru události, když CacheRequest je aktivní. Předaná AutomationElement obslužné rutině události jako zdroj události obsahuje vlastnosti uložené v mezipaměti a vzory určené původní CacheRequest. Žádné změny provedené po CacheRequest přihlášení k odběru události nemají žádný vliv.
Vlastnosti model UI Automation a vzory ovládacích prvků lze uložit do mezipaměti.
Možnosti pro Ukládání do mezipaměti
Určuje CacheRequest následující možnosti ukládání do mezipaměti.
Vlastnosti do mezipaměti
Vlastnosti, které se mají ukládat do mezipaměti, můžete zadat voláním Add(AutomationProperty) každé vlastnosti před aktivací požadavku.
Vzory ovládacích prvků do mezipaměti
Řídicí vzory, které se mají ukládat do mezipaměti, můžete zadat voláním Add(AutomationPattern) jednotlivých vzorů před aktivací požadavku. Pokud je vzor uložen v mezipaměti, jeho vlastnosti se automaticky neukládají do mezipaměti; je nutné zadat vlastnosti, které chcete uložit do mezipaměti pomocí .CacheRequest.Add
Rozsah a filtrování Ukládání do mezipaměti
Můžete zadat prvky, jejichž vlastnosti a vzory chcete uložit do mezipaměti, nastavením CacheRequest.TreeScope vlastnosti před aktivací požadavku. Obor je relativní vzhledem k prvkům, které se načtou, když je požadavek aktivní. Pokud například nastavíte pouze Childrena pak načtete AutomationElementvlastnosti a vzory podřízených objektů tohoto prvku, které jsou uloženy v mezipaměti, ale nikoli prvky samotného prvku. Pokud chcete zajistit, aby se ukládání do mezipaměti provádělo pro samotný načtený prvek, musíte zahrnout Element do TreeScope vlastnosti. Rozsah není možné nastavit na Parent nebo Ancestors. Nadřazený prvek však může být uložen do mezipaměti při ukládání podřízeného elementu do mezipaměti. Další informace naleznete v tématu Načítání podřízených a nadřazených objektů uložených v mezipaměti.
Rozsah ukládání do mezipaměti je také ovlivněn vlastností CacheRequest.TreeFilter . Ve výchozím nastavení se ukládání do mezipaměti provádí pouze pro prvky, které se zobrazují v zobrazení ovládacího prvku model UI Automation stromu. Tuto vlastnost však můžete změnit tak, aby se ukládání do mezipaměti použilo pro všechny prvky, nebo pouze na prvky, které se zobrazují v zobrazení obsahu.
Síla odkazů na elementy
Při načtení objektu AutomationElement, ve výchozím nastavení máte přístup ke všem vlastnostem a vzorům tohoto prvku, včetně těch, které nebyly uloženy v mezipaměti. Pro větší efektivitu však můžete určit, že odkaz na prvek odkazuje pouze na data uložená v mezipaměti nastavením AutomationElementMode vlastnosti CacheRequest na Nonehodnotu . V tomto případě nemáte přístup k žádným vlastnostem a vzorům načtených prvků, které nejsou uložené v mezipaměti. To znamená, že nemáte přístup k žádným vlastnostem prostřednictvím GetCurrentPropertyValue ani vlastnosti ani žádného AutomationElement vzoru ovládacího prvku, ani nemůžete vzor načíst pomocí nebo GetCurrentPatternTryGetCurrentPattern.Current
U vzorů uložených v mezipaměti můžete volat metody, které načítají vlastnosti pole, například SelectionPattern.SelectionPatternInformation.GetSelection, ale ne žádné, které provádějí akce na ovládacím prvku, například InvokePattern.Invoke.
Příkladem aplikace, která nemusí potřebovat úplné odkazy na objekty, je čtečka obrazovky, která by předem načítá Name a ControlType vlastnosti prvků v okně, ale samotné objekty by nepotřebovaly AutomationElement .
Aktivace cacheRequest
Ukládání do mezipaměti se provádí pouze v případě, že AutomationElement jsou objekty načteny, když CacheRequest je aktivní pro aktuální vlákno. Existují dva způsoby, jak aktivovat CacheRequest.
Obvyklým způsobem je volat Activate. Tato metoda vrátí objekt, který implementuje IDisposable. Požadavek zůstane aktivní, dokud IDisposable objekt existuje. Nejjednodušší způsob, jak řídit životnost objektu, je uzavřít volání do using
bloku (C#) nebo Using
(Visual Basic). Tím se zajistí, že se požadavek ze zásobníku přepne, i když dojde k výjimce.
Dalším způsobem, který je užitečný, když chcete vnořit požadavky mezipaměti, je volat Push. Tím se požadavek vloží do zásobníku a aktivuje ho. Požadavek zůstane aktivní, dokud se neodebere ze zásobníku Pop. Požadavek bude dočasně neaktivní, pokud se do zásobníku odešle jiný požadavek; Aktivní je pouze horní požadavek v zásobníku.
Načítání vlastností uložených v mezipaměti
Vlastnosti elementu uložené v mezipaměti můžete načíst následujícími metodami a vlastnostmi.
Výjimka se vyvolá, pokud požadovaná vlastnost není v mezipaměti.
Cached, například Current, zveřejňuje jednotlivé vlastnosti jako členy struktury. Tuto strukturu však nemusíte načítat; k jednotlivým vlastnostem se dostanete přímo. Vlastnost lze například Name získat z element.Cached.Name
, kde element
je .AutomationElement
Načítání vzorů ovládacích prvků uložených v mezipaměti
Vzory ovládacích prvků uložených v mezipaměti můžete načíst pomocí následujících metod.
Pokud vzor není v mezipaměti, GetCachedPattern vyvolá výjimku a TryGetCachedPattern vrátí false
.
Vlastnosti ovládacího prvku uložené v mezipaměti můžete načíst pomocí Cached
vlastnosti objektu vzoru. Můžete také načíst aktuální hodnoty prostřednictvím Current
vlastnosti, ale pouze pokud None nebyl zadán při AutomationElement načtení. (Full je výchozí hodnota a to umožňuje přístup k aktuálním hodnotám.)
Načítání podřízených objektů a rodičů uložených v mezipaměti
Když načtete AutomationElement a vyžádáte ukládání do mezipaměti pro podřízené položky tohoto prvku prostřednictvím TreeScope vlastnosti požadavku, je následně možné získat podřízené prvky z CachedChildren vlastnosti prvku, který jste získali.
Pokud Element byl zahrnut v rozsahu požadavku mezipaměti, kořenový prvek požadavku je následně k dispozici z CachedParent vlastnosti libovolného podřízeného elementu.
Poznámka:
Nadřazené prvky požadavku nelze ukládat do mezipaměti ani nadřazené prvky původního prvku požadavku.
Aktualizace mezipaměti
Mezipaměť je platná pouze za předpokladu, že se v uživatelském rozhraní nic nezmění. Vaše aplikace zodpovídá za aktualizaci mezipaměti, obvykle v reakci na události.
Pokud se přihlásíte k odběru události, když CacheRequest je aktivní, získáte AutomationElement jako zdroj události aktualizovanou mezipaměť při každém zavolání delegáta obslužné rutiny události. Informace uložené v mezipaměti pro prvek můžete aktualizovat také voláním GetUpdatedCache. Původní soubor můžete předat CacheRequest , abyste aktualizovali všechny informace, které byly dříve uloženy v mezipaměti.
Aktualizace mezipaměti nemění vlastnosti existujících AutomationElement odkazů.