共用方式為


UI 自動化用戶端中的快取

注意事項注意事項

這份文件適用於想要使用 System.Windows.Automation 命名空間中定義之 Managed UI Automation 類別的 .NET Framework 開發人員。如需 UI Automation 的最新資訊,請參閱 Windows Automation API:使用者介面自動化 (英文)。

本主題簡介 UI Automation屬性和控制項模式的快取。 

在 UI Automation中,快取代表預先擷取的資料。 之後,即可存取資料,而無需進行進一步的跨處理序通訊。 快取通常是由 UI 自動化用戶端應用程式使用,作用是擷取屬性和大量控制模式。 之後,會視需要從快取擷取資訊。 應用程式會定期更新快取,通常是爲了反應user interface (UI) 中某設定變更的重大事件。

快取與 Windows Presentation Foundation (WPF) 控制項和具有伺服器端 UI 自動化提供者的自訂控制項搭配使用時,可發揮最大功效。 存取用戶端提供者 (例如 Win32 控制項的預設提供者) 時功效就比較不顯著。

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

如果 CacheRequest 在作用中,則當您訂閱事件時,也會發生快取。 AutomationElement 做為事件來源傳遞至您的事件處理常式,會包含由原始 CacheRequest 指定的快取屬性和模式。 當您訂閱該事件之後,對 CacheRequest 所做的任何變更都無效。

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

這個主題包含下列章節。

  • 快取選項
  • 啟動快取要求
  • 擷取快取屬性
  • 擷取快取控制項模式
  • 擷取快取的子系和父代
  • 更新快取
  • 相關主題

快取選項

CacheRequest 會指定下列快取選項。

要快取的屬性

您可以在啟動要求之前,先呼叫每個屬性的 Add(AutomationProperty),來指定要快取的屬性。

要快取的控制項模式

您可以在啟動要求之前,先呼叫每個模式的 Add(AutomationPattern),來指定要快取的控制項模式。 快取模式時,並不會自動快取其屬性,您必須使用 CacheRequest.Add 來指定要快取的屬性。

快取的範圍和篩選

您可以在啟動要求之前,先設定 CacheRequest.TreeScope 屬性,來指定要快取其屬性和模式的項目。 範圍與在要求處於作用中時所擷取的項目有關。 例如,如果您只設定 Children,然後才擷取 AutomationElement,則會快取該項目之子系的屬性和模式,但不會快取項目本身。 若要確定完成擷取項目本身的快取,則必須將 Element 加入 TreeScope 屬性。 無法將範圍設定為 ParentAncestors。 但是,快取子項目時,也可快取父項目,請參閱本主題的「擷取快取的子系和父代」。

快取的程度也會受到 CacheRequest.TreeFilter 屬性影響。 根據預設,執行快取的對象只限於 UI Automation樹狀目錄之控制項檢視中顯示的項目。 但是,您可以將此屬性變更為將快取套用到所有項目,或是只套用到內容檢視中顯示的項目。

項目參考的強度

當您擷取 AutomationElement 時,您預設會擁有該項目所有屬性和模式的存取權限,包含尚未快取的屬性和模式。 但是,若要取得較佳效率,您可以將 CacheRequestAutomationElementMode 屬性設定為 None,來指定該項目的參考只參考快取資料。 這個時候,您便無法存取已擷取項目的非快取屬性和模式。 這代表您無法透過 GetCurrentPropertyValueAutomationElement 的 Current 屬性或任何控制項模式來存取任何屬性,也無法使用 GetCurrentPatternTryGetCurrentPattern 來擷取模式。 在快取模式中,您可以呼叫擷取陣列屬性的方法,例如 SelectionPattern.SelectionPatternInformation.GetSelection,但不要使用會在控制項上執行動作的方法,例如 InvokePattern.Invoke

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

啟動快取要求

只有當目前執行緒的 CacheRequest 在使用中,且在擷取 AutomationElement 物件時,才會執行快取。 啟動 CacheRequest 的方法有兩種。

常用的方法是呼叫 Activate。 這個方法會傳回實作 IDisposable 的物件。 只要 IDisposable 物件存在,要求就會保持作用中的狀態。 若要控制物件的存留期,最簡單的方法是將呼叫包含在 using (C#) 或 Using (Visual Basic) 區塊中。 這樣可以確保即使引發例外狀況,要求也會由堆疊取出。

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

擷取快取屬性

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

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

CachedCurrent 一樣,會將個別屬性公開為結構的成員。 但是,您不需要擷取此結構,即可直接存取個別屬性。 例如,Name 屬性可從 element.Cached.Name 取得,其中 element 是 AutomationElement

擷取快取控制項模式

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

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

您可以使用模式物件的 Cached 屬性來擷取控制項模式的快取屬性。 您也可以透過 Current 屬性擷取目前值,但只有在擷取 AutomationElement 時尚未指定 None,才可以這麼做 (Full 是預設值,且可允許存取目前值)。

擷取快取的子系和父代

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

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

注意事項注意事項

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

更新快取

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

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

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

請參閱

工作

使用 UI 自動化中的快取

FetchTimer Sample

概念

用戶端的 UI 自動化事件