Udostępnij za pomocą


Buforowanie w aplikacjach automatyzacji interfejsu użytkownika

Uwaga / Notatka

Ta dokumentacja jest przeznaczona dla deweloperów programu .NET Framework, którzy chcą używać zarządzanych klas automatyzacji interfejsu użytkownika zdefiniowanych w przestrzeni nazw System.Windows.Automation. Aby uzyskać najnowsze informacje na temat automatyzacji interfejsu użytkownika, zobacz Windows Automation API: Automatyzacja interfejsu użytkownika.

W tym temacie przedstawiono buforowanie właściwości automatyzacji interfejsu użytkownika i wzorców kontrolek.

W usłudze Automatyzacja interfejsu użytkownika buforowanie oznacza wcześniejsze pobieranie danych. Następnie można uzyskać dostęp do danych bez dalszej komunikacji między procesami. Buforowanie jest zwykle używane przez aplikacje klienckie automatyzacji interfejsu użytkownika do zbiorczego pobierania właściwości i wzorców sterowania. Informacje są następnie pobierane z pamięci podręcznej zgodnie z potrzebami. Aplikacja okresowo aktualizuje pamięć podręczną, zwykle w odpowiedzi na zdarzenia oznaczające, że coś w interfejsie użytkownika uległo zmianie.

Zalety buforowania są najbardziej zauważalne w przypadku kontrolek programu Windows Presentation Foundation (WPF) i kontrolek niestandardowych, które mają dostawców automatyzacji interfejsu użytkownika po stronie serwera. Uzyskiwanie dostępu do dostawców po stronie klienta, takich jak domyślni dostawcy kontrolek Win32, wiąże się z mniejszymi korzyściami.

Pamięciowanie występuje, gdy aplikacja aktywuje CacheRequest i następnie używa dowolnej metody lub właściwości zwracającej AutomationElement; na przykład FindFirst, FindAll. Metody TreeWalker klasy są wyjątkiem; buforowanie odbywa się tylko wtedy, gdy CacheRequest element jest określony jako parametr (na przykład TreeWalker.GetFirstChild(AutomationElement, CacheRequest).

Buforowanie ma również miejsce, gdy wydarzenie jest subskrybowane, a CacheRequest jest aktywny. Przekazany AutomationElement do programu obsługi zdarzeń jako źródło zdarzenia zawiera buforowane właściwości i wzorce określone przez oryginalny element CacheRequest. Wszelkie zmiany wprowadzone w CacheRequest po zasubskrybowaniu zdarzenia nie mają wpływu.

Właściwości automatyzacji interfejsu użytkownika i wzorce sterowania elementu można buforować.

Opcje buforowania

Parametr CacheRequest określa następujące opcje buforowania.

Właściwości do buforowania

Właściwości do buforowania można określić, wywołując Add(AutomationProperty) dla każdej właściwości przed aktywacją żądania.

Wzorce kontroli do zbuforowania

Wzorce kontroli, które mają być buforowane, można określić, najpierw wywołując każdy wzorzec za pomocą Add(AutomationPattern), a następnie aktywując żądanie. Gdy wzorzec jest buforowany, jego właściwości nie są automatycznie buforowane; należy określić właściwości, które mają być buforowane przy użyciu polecenia CacheRequest.Add.

Zakres i filtrowanie buforowania

Można określić elementy, których właściwości i wzorce mają być buforowane, ustawiając CacheRequest.TreeScope właściwość przed aktywacją żądania. Zakres jest względny względem elementów, które są pobierane, gdy żądanie jest aktywne. Na przykład, jeśli ustawisz tylko Children i pobierzesz AutomationElement, właściwości i wzorce dzieci tego elementu są buforowane, ale nie samego elementu. Aby upewnić się, że buforowanie jest wykonywane dla samego pobranego elementu, należy uwzględnić Element we TreeScope właściwości . Nie można ustawić zakresu na Parent lub Ancestors. Jednak element nadrzędny może być buforowany, gdy element podrzędny jest buforowany. Aby uzyskać więcej informacji, zobacz Pobieranie buforowanych dzieci i rodziców.

Zakres buforowania ma również wpływ na CacheRequest.TreeFilter właściwość . Domyślnie buforowanie jest wykonywane tylko dla elementów wyświetlanych w widoku sterowania drzewa automatyzacji interfejsu użytkownika. Można jednak zmienić tę właściwość, aby zastosować buforowanie do wszystkich elementów lub tylko do elementów wyświetlanych w widoku zawartości.

Siła odwołań do elementów

Gdy pobierasz element AutomationElement, domyślnie masz dostęp do wszystkich właściwości i wzorców tego elementu, w tym tych, które nie były buforowane. Jednak w celu zwiększenia wydajności można określić, że odwołanie do elementu odnosi się tylko do buforowanych danych, ustawiając właściwość AutomationElementMode elementu CacheRequest na wartość None. W takim przypadku nie masz dostępu do żadnych niebuforowanych właściwości i wzorców pobranych elementów. Oznacza to, że nie można uzyskać dostępu do żadnych właściwości za pośrednictwem GetCurrentPropertyValue lub właściwości CurrentAutomationElement, ani też żadnego wzorca kontrolki; nie można również pobrać wzorca, korzystając z GetCurrentPattern lub TryGetCurrentPattern. W buforowanych wzorcach można wywoływać metody pobierające właściwości tablicy, takie jak SelectionPattern.SelectionPatternInformation.GetSelection, ale nie te, które wykonują akcje w kontrolce, takie jak InvokePattern.Invoke.

Przykładem aplikacji, która może nie potrzebować pełnych odwołań do obiektów, jest czytnik ekranu, który wstępnie pobiera właściwości Name i ControlType elementów w oknie, ale nie wymagałby samych obiektów AutomationElement.

Aktywowanie CacheRequest

Buforowanie odbywa się tylko wtedy, gdy obiekty AutomationElement są pobierane, podczas gdy CacheRequest jest aktywny dla bieżącego wątku. Istnieją dwa sposoby aktywowania CacheRequest.

Typowy sposób to wywołanie Activate. Ta metoda zwraca obiekt, który implementuje IDisposable. Żądanie pozostaje aktywne, o ile IDisposable obiekt istnieje. Najłatwiejszym sposobem zarządzania okresem istnienia obiektu jest zamknięcie wywołania w bloku using (C#) lub Using (Visual Basic). Gwarantuje to, że żądanie zostanie usunięte ze stosu, nawet jeśli zostanie zgłoszony wyjątek.

Innym sposobem, który jest przydatny, gdy chcesz zagnieżdżać żądania cache, jest wywołanie metody Push. Umieszcza to żądanie na stosie i aktywuje je. Żądanie pozostaje aktywne, dopóki nie zostanie usunięte ze stosu przez Pop. Żądanie staje się tymczasowo nieaktywne, jeśli inne żądanie zostanie wypchnięte do stosu; aktywne jest tylko górne żądanie na stosie.

Pobieranie właściwości buforowanych

Buforowane właściwości elementu można pobrać za pomocą następujących metod i właściwości.

Zgłaszany jest wyjątek, jeśli żądana właściwość nie znajduje się w pamięci podręcznej.

Cached, na przykład Current, uwidacznia poszczególne właściwości jako elementy członkowskie struktury. Nie trzeba jednak pobierać tej struktury; dostęp do poszczególnych właściwości można uzyskać bezpośrednio. Na przykład Name właściwość można uzyskać z element.Cached.Name, gdzie element jest AutomationElement.

Pobieranie buforowanych wzorców sterowania

Buforowane wzorce kontrolek elementu można pobrać za pomocą następujących metod.

Jeśli wzorzec nie znajduje się w pamięci podręcznej, GetCachedPattern zgłasza wyjątek i TryGetCachedPattern zwraca wartość false.

Buforowane właściwości wzorca kontrolki można pobrać, używając właściwości Cached obiektu wzorca. Można również pobrać bieżące wartości za pośrednictwem właściwości Current, ale tylko wtedy, gdy None nie określono, gdy AutomationElement zostało pobrane. (Full jest wartością domyślną i zezwala na dostęp do bieżących wartości).

Pobieranie buforowanych dzieci i rodziców

Po pobraniu AutomationElement oraz zażądaniu buforowania elementów podrzędnych tego elementu za pomocą właściwości żądania TreeScope, możliwe jest następnie pobranie elementów podrzędnych z właściwości CachedChildren pobranego elementu.

Jeśli Element był uwzględniony w zakresie żądania pamięci podręcznej, to element główny żądania jest następnie dostępny za pośrednictwem właściwości CachedParent dowolnego z elementów podrzędnych.

Uwaga / Notatka

Nie można buforować nadrzędnych ani przodków elementu głównego żądania.

Aktualizowanie pamięci podręcznej

Pamięć podręczna jest ważna tylko tak długo, jak nic się nie zmienia w interfejsie użytkownika. Aplikacja jest odpowiedzialna za aktualizowanie pamięci podręcznej, zwykle w odpowiedzi na zdarzenia.

Jeśli subskrybujesz zdarzenie, gdy element CacheRequest jest aktywny, uzyskasz element AutomationElement ze zaktualizowaną pamięcią podręczną jako źródłem zdarzenia za każdym razem, gdy wywoływany jest delegat obsługujący zdarzenie. Możesz również zaktualizować buforowane informacje dla elementu, wywołując polecenie GetUpdatedCache. Możesz przekazać oryginał CacheRequest, aby zaktualizować wszystkie informacje, które zostały wcześniej zapisane w pamięci podręcznej.

Aktualizacja pamięci podręcznej nie zmienia właściwości żadnych istniejących AutomationElement odwołań.

Zobacz także