Buforowanie w klientach automatyzacji interfejsu użytkownika
Uwaga
Ta dokumentacja jest przeznaczona dla deweloperów programu .NET Framework, którzy chcą używać zarządzanych klas automatyzacja interfejsu użytkownika zdefiniowanych w System.Windows.Automation przestrzeni nazw. Aby uzyskać najnowsze informacje na temat automatyzacja interfejsu użytkownika, zobacz Interfejs API usługi Windows Automation: automatyzacja interfejsu użytkownika.
W tym temacie przedstawiono buforowanie automatyzacja interfejsu użytkownika właściwości i wzorców kontrolek.
W automatyzacja interfejsu użytkownika buforowanie oznacza wstępne pobieranie danych. Następnie można uzyskać dostęp do danych bez dalszej komunikacji między procesami. Buforowanie jest zwykle używana przez aplikacje klienckie automatyzacja 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 Windows Presentation Foundation (WPF) i kontrolek niestandardowych, które mają dostawców automatyzacja interfejsu użytkownika po stronie serwera. W przypadku uzyskiwania dostępu do dostawców po stronie klienta, takich jak domyślni dostawcy kontrolek Win32, jest mniejsza korzyść.
Buforowanie występuje, gdy aplikacja aktywuje CacheRequest obiekt , a następnie używa dowolnej metody lub właściwości zwracającej AutomationElementobiekt , 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 występuje również podczas subskrybowania zdarzenia, gdy CacheRequest element 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 obiekcie po zasubskrybowaniu zdarzenia nie mają wpływu.
Właściwości automatyzacja interfejsu użytkownika i wzorce sterowania elementu można buforować.
Opcje Buforowanie
Parametr CacheRequest określa następujące opcje buforowania.
Właściwości pamięci podręcznej
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 kontrolek do pamięci podręcznej
Wzorce kontrolek do buforowania można określić, wywołując Add(AutomationPattern) każdy wzorzec przed aktywacją żądania. 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 Buforowanie
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. Jeśli na przykład ustawisz tylko Childrenelement , a następnie pobierzesz AutomationElementwłaściwości i wzorce elementów podrzędnych tego elementu są buforowane, ale nie te z 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 automatyzacja 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 AutomationElementMode właściwość na CacheRequestNonewartość . 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 ani Current
właściwości AutomationElement ani żadnego wzorca kontrolki; nie można też pobrać wzorca przy użyciu metody GetCurrentPattern lub TryGetCurrentPattern. W buforowanych wzorcach można wywoływać metody pobierające właściwości tablicy, takie jak , ale nie wszystkie, które wykonują akcje w kontrolce, takie jak SelectionPattern.SelectionPatternInformation.GetSelectionInvokePattern.Invoke.
Przykładem aplikacji, która może nie potrzebować pełnych odwołań do obiektów, jest czytnik zawartości ekranu, który wstępnie pobiera Name właściwości elementów i ControlType w oknie, ale nie wymagałby AutomationElement samych obiektów.
Aktywowanie pamięci podręcznejRequest
Buforowanie jest wykonywana tylko wtedy, gdy AutomationElement obiekty są pobierane, gdy element CacheRequest jest aktywny dla bieżącego wątku. Istnieją dwa sposoby aktywowania .CacheRequest
Typowym sposobem jest wywołanie metody Activate. Ta metoda zwraca obiekt, który implementuje IDisposableelement . Żądanie pozostaje aktywne, o ile IDisposable obiekt istnieje. Najprostszym sposobem kontrolowania okresu istnienia obiektu jest ujęcie wywołania w using
bloku (C#) lub Using
(Visual Basic). Gwarantuje to, że żądanie zostanie wyświetlone ze stosu, nawet jeśli zostanie zgłoszony wyjątek.
Innym sposobem, co jest przydatne, gdy chcesz zagnieżdżać żądania pamięci podręcznej, jest wywołanie metody Push. Spowoduje to przeniesienie żądania na stos i aktywowanie go. Żą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
obiektu , gdzie element
to AutomationElement.
Pobieranie buforowanych wzorców kontrolek
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
.
Właściwości buforowanego wzorca kontrolki można pobrać przy użyciu Cached
właściwości obiektu wzorca. Można również pobrać bieżące wartości za pośrednictwem Current
właściwości, ale tylko wtedy, gdy None nie określono wartości, gdy AutomationElement został pobrany. (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 buforowania elementów podrzędnych tego elementu i za pomocą TreeScope właściwości żądania można następnie pobrać elementy podrzędne z CachedChildren właściwości pobranego elementu.
Jeśli Element element główny żądania został uwzględniony w zakresie żądania pamięci podręcznej, element główny żądania jest następnie dostępny z CachedParent właściwości dowolnych elementów podrzędnych.
Uwaga
Nie można buforowania elementów nadrzędnych ani elementów nadrzędnych elementu głównego żądania.
Aktualizowanie pamięci podręcznej
Pamięć podręczna jest prawidłowa 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 AutomationElement element ze zaktualizowaną pamięcią podręczną jako źródło zdarzenia za każdym razem, gdy jest wywoływany delegat programu obsługi zdarzeń. 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ń.