Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Remarque
Cette documentation est destinée aux développeurs .NET Framework qui souhaitent utiliser les classes UI Automation managées définies dans l’espace de noms System.Windows.Automation. Pour obtenir les informations les plus récentes sur UI Automation, consultez API Windows Automation : UI Automation.
Cette rubrique présente la mise en cache des propriétés et des modèles de contrôle UI Automation.
Dans UI Automation, la mise en cache signifie pré-extraction des données. Les données sont ensuite accessibles sans communication interprocessus. La mise en cache est généralement utilisée par les applications clientes UI Automation pour récupérer des propriétés et des modèles de contrôle en bloc. Les informations sont ensuite récupérées à partir du cache en fonction des besoins. L’application met à jour le cache régulièrement, généralement en réponse aux événements indiquant que quelque chose dans l’interface utilisateur (UI) a changé.
Les avantages de la mise en cache sont particulièrement visibles avec les contrôles de Windows Presentation Foundation (WPF) et les contrôles personnalisés dotés de fournisseurs d'Automatisation de l'interface utilisateur côté serveur. Il existe moins d’avantages lors de l’accès aux fournisseurs côté client, tels que les fournisseurs par défaut pour les contrôles Win32.
La mise en cache se produit lorsque l’application active un CacheRequest et utilise ensuite toute méthode ou propriété qui retourne un AutomationElement : par exemple, FindFirst, FindAll. Les méthodes de la TreeWalker classe sont une exception ; la mise en cache est effectuée uniquement si un CacheRequest paramètre est spécifié (par exemple. TreeWalker.GetFirstChild(AutomationElement, CacheRequest)
La mise en cache se produit également lorsque vous vous abonnez à un événement pendant qu’un CacheRequest événement est actif. L’objet AutomationElement passé au gestionnaire d’événements comme source d’un événement contient les propriétés mises en cache et les modèles spécifiés par le CacheRequestd’origine. Toute modification apportée à CacheRequest après votre abonnement à l’événement n’a aucun effet.
Les propriétés et les modèles de contrôle UI Automation d’un élément peuvent être mis en cache.
Options de mise en cache
Spécifie CacheRequest les options suivantes pour la mise en cache.
Propriétés à mettre en cache
Vous pouvez spécifier des propriétés à mettre en cache en appelant Add(AutomationProperty) chaque propriété avant d’activer la requête.
Modèles de contrôle à mettre en cache
Vous pouvez spécifier des modèles de contrôle à mettre en cache en appelant Add(AutomationPattern) chaque modèle avant d’activer la requête. Lorsqu’un modèle est mis en cache, ses propriétés ne sont pas automatiquement mises en cache ; vous devez spécifier les propriétés que vous souhaitez mettre en cache à l’aide CacheRequest.Addde .
Étendue et filtrage de la mise en cache
Vous pouvez spécifier les éléments dont vous souhaitez mettre en cache les propriétés et les modèles en définissant la CacheRequest.TreeScope propriété avant d’activer la requête. L’étendue est relative aux éléments récupérés pendant que la requête est active. Par exemple, si vous définissez uniquement Children, puis récupérez un AutomationElement, les propriétés et les modèles des enfants de cet élément sont mis en cache, mais pas ceux de l’élément lui-même. Pour vous assurer que la mise en cache est effectuée pour l’élément récupéré lui-même, vous devez inclure Element dans la TreeScope propriété. Il n’est pas possible de définir l’étendue sur Parent ou Ancestors. Toutefois, un élément parent peut être mis en cache lorsqu’un élément enfant est mis en cache. Pour plus d’informations, consultez Récupération des enfants et des parents mis en cache.
L’étendue de la mise en cache est également affectée par la CacheRequest.TreeFilter propriété. Par défaut, la mise en cache est effectuée uniquement pour les éléments qui apparaissent dans la vue de contrôle de l’arborescence UI Automation. Toutefois, vous pouvez modifier cette propriété pour appliquer la mise en cache à tous les éléments ou uniquement aux éléments qui apparaissent dans la vue de contenu.
Force des références d’un élément
Lorsque vous récupérez un AutomationElement, par défaut, vous avez accès à toutes les propriétés et modèles de cet élément, y compris ceux qui n’ont pas été mis en cache. Toutefois, pour une plus grande efficacité, vous pouvez spécifier que la référence à l’élément fait référence aux données mises en cache uniquement, en définissant la AutomationElementMode propriété sur CacheRequestNone. Dans ce cas, vous n’avez pas accès aux propriétés et modèles non mis en cache des éléments récupérés. Cela signifie que vous ne pouvez accéder à aucune propriété via GetCurrentPropertyValue, ni à la propriété Current de AutomationElement, ni à aucun modèle de contrôle ; ni ne pouvez récupérer un modèle en utilisant GetCurrentPattern ou TryGetCurrentPattern. Sur les modèles mis en cache, vous pouvez appeler des méthodes qui récupèrent des propriétés de tableau, telles que SelectionPattern.SelectionPatternInformation.GetSelection, mais pas celles qui effectuent des actions sur le contrôle, telles que InvokePattern.Invoke.
Un exemple d'application qui ne nécessite pas forcément des références complètes à des objets est un lecteur d'écran, qui prérécupère les propriétés Name et ControlType des éléments d'une fenêtre, mais qui n'a pas besoin des objets AutomationElement eux-mêmes.
Activation de cacheRequest
La mise en cache est effectuée uniquement lorsque les AutomationElement objets sont récupérés pendant qu’un CacheRequest est actif pour le thread actuel. Il existe deux façons d’activer un CacheRequest.
La façon habituelle est d’appeler Activate. Cette méthode retourne un objet qui implémente IDisposable. La requête reste active tant que l’objet IDisposable existe. Le moyen le plus simple de contrôler la durée de vie de l’objet consiste à placer l’appel dans un using bloc (C#) ou Using (Visual Basic). Cela garantit l’extraction de la demande de la pile même si une exception est levée.
Une autre façon, qui est utile lorsque vous souhaitez imbriquer des demandes de cache, consiste à appeler Push. Cette opération place la requête sur une pile et l’active. La requête reste active jusqu’à ce qu’elle soit supprimée de la pile par Pop. La demande devient temporairement inactive si une autre demande est envoyée (push) sur la pile ; seule la requête supérieure sur la pile est active.
Récupération des propriétés mises en cache
Vous pouvez récupérer les propriétés mises en cache d’un élément via les méthodes et propriétés suivantes.
Une exception est levée si la propriété demandée n’est pas dans le cache.
Cached, comme Current, expose des propriétés individuelles en tant que membres d’une structure. Toutefois, vous n’avez pas besoin de récupérer cette structure ; vous pouvez accéder directement aux propriétés individuelles. Par exemple, la Name propriété peut être obtenue à partir de element.Cached.Name, où element est un AutomationElement.
Récupération des modèles de contrôle mis en cache
Vous pouvez récupérer les modèles de contrôle mis en cache d’un élément via les méthodes suivantes.
Si le modèle n’est pas dans le cache, GetCachedPattern déclenche une exception et TryGetCachedPattern retourne false.
Vous pouvez récupérer les propriétés mises en cache d’un modèle de contrôle à l’aide de la Cached propriété de l’objet de modèle. Vous pouvez également récupérer les valeurs actuelles via la propriété Current, mais uniquement si None n’a pas été spécifiée lors de la récupération de AutomationElement. (Full est la valeur par défaut, et cela autorise l’accès aux valeurs actuelles.)
Récupération des enfants et des parents mis en cache
Lorsque vous récupérez un AutomationElement et demandez le stockage en cache des enfants de cet élément via la propriété TreeScope de la requête, il est ensuite possible d’obtenir les éléments enfants à partir de la propriété CachedChildren de l’élément que vous avez récupéré.
Si Element a été inclus dans la portée de la demande de cache, l’élément racine de la requête est ensuite disponible via la propriété CachedParent de l’un des éléments enfants.
Remarque
Vous ne pouvez pas mettre en cache les parents ou les ancêtres de l’élément racine de la requête.
Mise à jour du cache
Le cache n’est valide que tant que rien ne change dans l’interface utilisateur. Votre application est chargée de mettre à jour le cache, généralement en réponse aux événements.
Si vous vous abonnez à un événement pendant qu’un CacheRequest est actif, vous obtenez un AutomationElement avec un cache mis à jour comme source de l’événement chaque fois que votre délégué de gestionnaire d'événement est appelé. Vous pouvez également mettre à jour les informations mises en cache pour un élément en appelant GetUpdatedCache. Vous pouvez transmettre l’original CacheRequest pour mettre à jour toutes les informations précédemment mises en cache.
La mise à jour du cache ne modifie pas les propriétés des références existantes AutomationElement .