UI 自動化用戶端中的快取

注意

本文件適用對象為 .NET Framework 開發人員,其想要使用 System.Windows.Automation 命名空間中定義的受控 UI 自動化類別。 如需 UI 自動化的最新資訊,請參閱 Windows 自動化 API:UI 自動化

本主題將介紹 UI 自動化屬性和控制項模式的快取。

在 UI 自動化中,快取表示預先擷取資料。 該資料即可供存取,而不需進一步的跨處理序通訊。 使用者介面自動化用戶端應用程式通常會使用快取來大量擷取屬性和控制項模式。 接著,就會視需要從快取中擷取資訊。 應用程式通常會為了回應使用者介面 (UI) 中有項目已變更的事件,而定期更新快取。

在搭配 Windows Presentation Foundation 控制項和具有伺服器端使用者介面自動化提供者的自訂控制項時,快取的優勢最明顯。 在存取用戶端提供者 (如 Win32 控制項的預設提供者) 時,優勢較不明顯。

下列情況會發生快取:當應用程式啟動 CacheRequest ,然後使用任何會傳回 AutomationElement的方法或屬性時;例如 FindFirstFindAllTreeWalker 類別的方法例外;僅有在指定 CacheRequest 為參數 (例如 TreeWalker.GetFirstChild(AutomationElement, CacheRequest)) 時會完成快取。

CacheRequest 為作用中時訂閱事件,也會發生快取。 AutomationElement 會以事件來源的形式傳遞給事件處理常式,其中包含快取的屬性和原始 CacheRequest所指定的模式。 在您訂閱事件之後所做的任何 CacheRequest 變更皆不會有任何作用。

您可以快取項目的 UI 自動化屬性和控制項模式。

快取選項

CacheRequest 可指定下列快取選項。

要快取的屬性

您可呼叫每一個屬性的 Add(AutomationProperty) 之後再啟動要求,以指定要快取的屬性。

要快取的控制項模式

您可呼叫每一個模式的 Add(AutomationPattern) 之後再啟動要求,以指定要快取的控制項模式。 快取模式時,不會自動快取它的屬性;您必須使用 CacheRequest.Add指定您要快取的屬性。

快取的範圍和篩選

您可以設定 CacheRequest.TreeScope 屬性之後再啟動要求,以指定要快取其屬性和模式的項目。 範圍與在要求處於作用中時所擷取的項目有關。 例如,如果您只設定 Children,然後擷取 AutomationElement,則會快取該項目子系的屬性和項目,而不是項目本身的屬性和項目。 若要確保進行擷取項目本身的快取,您必須在 Element 屬性中包含 TreeScope 。 您無法將範圍設 ParentAncestors。 不過,在快取子元素時,可以快取父元素。 如需詳細資訊,請參閱擷取快取的子系和父代

快取的範圍也會受到 CacheRequest.TreeFilter 屬性的影響。 根據預設,僅會針對在 UI 自動化樹狀結構的控制項檢視中出現的元素執行快取。 不過,您可以變更此屬性,將快取套用至所有項目,或是只套用至內容檢視中顯示的項目。

項目參考的強度

擷取 AutomationElement時,預設為您可以存取該項目的所有屬性與模式 (包括未快取的屬性與模式)。 不過,如需更高的效率,您可以將 AutomationElementModeCacheRequest 屬性設為 None,以指定項目參考僅參考快取的資料。 在此情況下,您就不能存取擷取項目的任何非快取屬性和模式。 這表示您無法透過 GetCurrentPropertyValueCurrentAutomationElement 屬性擷取任何屬性或控制項模式;也無法使用 GetCurrentPatternTryGetCurrentPattern擷取模式。 在快取模式上,您可以呼叫 SelectionPattern.SelectionPatternInformation.GetSelection這類擷取陣列屬性的方法,而不是 InvokePattern.Invoke這類在控制項上執行動作的方法。

舉例來說,螢幕助讀程式是可能不需要物件完整參考的應用程式,其會預先擷取視窗中項目的 NameControlType 屬性,而不需 AutomationElement 物件本身。

啟動 CacheRequest

僅有在目前執行緒的 AutomationElement 為作用中時擷取 CacheRequest 物件才會執行快取。 有兩個方法可以啟動 CacheRequest

一般方式是呼叫 Activate。 此方法會傳回實作 IDisposable的物件。 只要 IDisposable 物件存在,要求就會保持作用中狀態。 控制物件存留期最簡單的方式是在呼叫內包含 using (C#) 或 Using (Visual Basic) 區塊。 這可確保該要求可從堆疊推出,即使引發例外狀況亦同。

另一種方法是呼叫 Push,這種方法在您要將快取要求進行巢狀處理時相當有用。 這會將要求放置在堆疊上,並且啟動要求。 要求會保持作用中狀態,直到 Pop將要求從堆疊移除為止。 如果另一個要求被推入到堆疊,要求則會暫時變成非作用中,只有堆疊最上層的要求仍然保持作用中的狀態。

擷取快取屬性

您可以透過下列方法和屬性來擷取項目的快取屬性。

如果要求的屬性不在快取中,會引發例外狀況。

Cached就像 Current一樣,會將個別屬性公開為結構的成員。 不過,您不需要擷取此結構,而可以直接存取個別的屬性。 例如, Name 屬性可以取自 element.Cached.Name,其中 element 是一種 AutomationElement

擷取快取控制項模式

您可以透過下列方法來擷取項目的快取控制項模式。

如果模式不在快取中, GetCachedPattern 會引發例外狀況,而 TryGetCachedPattern 會傳回 false

您可以使用模式物件的 Cached 屬性,擷取控制項模式的快取屬性。 您也可以透過 Current 屬性擷取目前的值,但是前提是當擷取 None 時未指定 AutomationElement (預設值為Full ,可允許存取目前的值)。

擷取快取的子系和父代

當您擷取 AutomationElement 並透過要求的 TreeScope 屬性,要求快取該項目的子系時,後續可能會從您擷取的 CachedChildren 項目屬性取得子系項目。

如果 Element 已包含在快取要求的範圍內,隨後即可從任何子項目的 CachedParent 屬性取得要求的根項目。

注意

您無法快取要求之根項目的父代或祖系。

更新快取

只有在 UI 保持不變的情況下,快取才會持續有效。 更新快取的工作由應用程式負責,目的通常是為了回應事件。

如果您在 CacheRequest 為作用中時訂閱事件,即可取得 AutomationElement ,並且在呼叫事件處理常式委派時,取得做為事件來源的更新快取。 您也可以藉由呼叫 GetUpdatedCache來更新項目的快取資訊。 您可以在原始 CacheRequest 中傳遞,以更新之前快取過的所有資訊。

更新快取不會更改任何現有 AutomationElement 參考的屬性。

另請參閱