共用方式為


UI 自動化用戶端中的快取

備註

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

本主題介紹使用者介面自動化屬性和控制模式的快取機制。

在UI自動化中,快取表示預先擷取數據。 接著可以存取數據,而不需進一步的跨進程通訊。 使用者介面自動化用戶端應用程式通常會使用快取來擷取大量屬性和控制模式。 接著會視需要從快取擷取資訊。 應用程式會定期更新快取,通常是回應使用者介面(UI)內表示某些功能有所變更的事件。

快取的優點最顯著於使用 Windows Presentation Foundation (WPF) 控制項及具有伺服器端 UI 自動化提供者的自訂控制項時。 存取用戶端提供者時,優點較少,例如 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,這樣指定元素的參考只會涉及快取的數據。 在這種情況下,您無法存取任何未快取的屬性及已擷取元素的模式。 這意味著您無法透過 GetCurrentPropertyValueCurrent 屬性存取 AutomationElement 的任何屬性或控制模式,也不能使用 GetCurrentPatternTryGetCurrentPattern 來檢索模式。 在快取的模式上,您可以呼叫擷取陣列屬性的方法,例如 SelectionPattern.SelectionPatternInformation.GetSelection,但不能呼叫對控件執行動作的任何方法,例如 InvokePattern.Invoke

可能不需要物件完整參考的應用程式範例是螢幕助讀程式,它會預先擷取 Name 視窗內元素的 和 ControlType 屬性,但不需要 AutomationElement 物件本身。

啟用 CacheRequest

只有在目前線程使用中時 AutomationElement 擷取物件時 CacheRequest ,才會執行快取。 有兩種方式可以啟動 CacheRequest

一般方式是呼叫 Activate。 這個方法會傳回實作 IDisposable的物件。 只要物件存在,要求就會保持作用中 IDisposable 。 控制物件存留期最簡單的方式是將呼叫封入 using(C#)或 Using(Visual Basic)區塊內。 這可確保即使發生異常,也能從堆疊中彈出請求。

另一種在您希望嵌套快取請求時很有用的方法是呼叫 Push。 這會將要求放在堆疊上並將其啟動。 當請求從堆疊中被Pop移除之前,它會保持為作用中。 如果另一個要求推送至堆疊,要求會暫時變成非作用中;只有堆疊上的最上層要求作用中。

檢索快取屬性

您可以透過下列方法和屬性來取得元素的快取屬性。

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

Cached,如同 Current,將個別屬性公開為結構中的成員。 不過,您不需要擷取此結構;您可以直接存取個別屬性。 例如,可以從 Name 取得 element.Cached.Name 屬性,其中 elementAutomationElement

擷取快取控件模式

您可以透過下列方法擷取元素的快取控件模式。

如果模式不在快取中, GetCachedPattern 則引發例外狀況,並 TryGetCachedPatternfalse回 。

您可以使用模式對象的Cached屬性來擷取控件模式的緩存屬性。 您也可以透過Current屬性取得當前的值,但前提是取回None時未指定AutomationElement。 (Full 是預設值,這允許存取目前的值。

擷取快取的子系和父系

當您透過AutomationElement要求的屬性擷取TreeScope時,並要求快取其子元素,之後可以從所擷取元素的CachedChildren屬性中取得其子元素。

如果 Element 包含在快取要求的範圍中,則可以從任何子元素的 CachedParent 屬性中取得該要求的根元素。

備註

您無法快取請求根元素的父元素或祖先元素。

更新快取

只要UI中沒有任何變更,快取才有效。 您的應用程式負責更新快取,通常是為了回應事件。

如果您在 CacheRequest 活動時訂閱事件,當呼叫事件處理程式委派時,您將獲得一個以更新快取作為事件來源的 AutomationElement。 您也可以呼叫 GetUpdatedCache來更新元素的快取資訊。 您可以傳入原始 CacheRequest 版本,以更新先前快取的所有資訊。

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

另請參閱