Almacenar en caché en los clientes de automatización de la interfaz de usuario

Nota

Esta documentación está dirigida a los desarrolladores de .NET Framework que quieran usar las clases de automatización de la interfaz de usuario administradas definidas en el espacio de nombres System.Windows.Automation. Para ver la información más reciente acerca de la automatización de la interfaz de usuario, consulte Windows Automation API: automatización de la interfaz de usuario.

En este tema se presenta el almacenamiento en caché de los patrones de control y las propiedades de automatización de la interfaz de usuario.

En automatización de la interfaz de usuario, almacenamiento en caché implica la captura previa de datos. Así, es posible acceder a los datos sin necesidad de más comunicación entre procesos. Normalmente, el almacenamiento en caché se utiliza en aplicaciones cliente de Automatización de la interfaz de usuario para recuperar los patrones de control y las propiedades de forma masiva. La información se recupera después desde la caché según sea necesario. La aplicación actualiza periódicamente la caché, normalmente en respuesta a eventos que indican que algo en la interfaz de usuario (UI) ha cambiado.

Las ventajas del almacenamiento en caché se aprecian mejor con controles y controles personalizados de Windows Presentation Foundation (WPF) que tengan proveedores de Automatización de la interfaz de usuario de lado servidor. Las ventajas son menores si se accede a proveedores de lado cliente, como los proveedores predeterminados de los controles de Win32.

El almacenamiento en caché se produce cuando la aplicación activa un elemento CacheRequest y después utiliza cualquier método o propiedad que devuelva un elemento AutomationElement; por ejemplo, FindFirst, FindAll. Los métodos de la clase TreeWalker son una excepción; el almacenamiento en caché solo se realiza si se especifica un elemento CacheRequest como un parámetro (por ejemplo, TreeWalker.GetFirstChild(AutomationElement, CacheRequest)).

El almacenamiento en caché también se produce al suscribirse a un evento mientras un elemento CacheRequest está activo. El elemento AutomationElement que se pasa al controlador de eventos como el origen de un evento contiene los patrones y las propiedades almacenadas en caché que especifica el elemento CacheRequestoriginal. Los cambios realizados en el elemento CacheRequest después de suscribirse al evento no tienen ningún efecto.

Los patrones de control y las propiedades de la automatización de la interfaz de usuario de un elemento pueden almacenarse en caché.

Opciones de almacenamiento en caché

CacheRequest especifica las siguientes opciones para el almacenamiento en caché.

Propiedades que se almacenarán en caché

Puede especificar las propiedades que se almacenarán en caché mediante una llamada a Add(AutomationProperty) por cada propiedad antes de activar la solicitud.

Patrones de control que se almacenarán en caché

Puede especificar los patrones de control que se almacenarán en caché mediante una llamada a Add(AutomationPattern) por cada patrón antes de activar la solicitud. Cuando un patrón se almacena en caché, sus propiedades no se almacenan automáticamente; debe especificar las propiedades que quiera que se almacenen en caché mediante CacheRequest.Add.

Ámbito y filtrado del almacenamiento en caché

Puede especificar los elementos cuyos patrones y propiedades quiera almacenar en caché mediante el establecimiento de la propiedad CacheRequest.TreeScope antes de activar la solicitud. El ámbito es relativo a los elementos que se recuperan mientras la solicitud está activa. Por ejemplo, si solo se define Childreny después se recupera un elemento AutomationElement, los patrones y las propiedades de los elementos secundarios de ese elemento se almacenan en caché, pero no sucede lo mismo con los del propio elemento. Para garantizar que se realiza el almacenamiento en caché para el propio elemento recuperado, debe incluir Element en la propiedad TreeScope . No es posible establecer el ámbito en Parent o Ancestors. Pero un elemento primario se puede almacenar en caché cuando se almacena en caché un elemento secundario. Para más información, vea Recuperación de elementos secundarios y primarios almacenados en caché.

El alcance del almacenamiento en caché también se ve afectado por la propiedad CacheRequest.TreeFilter . De forma predeterminada, el almacenamiento en caché se realiza solo para los elementos que aparecen en la vista de control del árbol de la automatización de la interfaz de usuario. Sin embargo, puede cambiar esta propiedad para aplicar el almacenamiento en caché a todos los elementos o solo a los que aparecen en la vista de contenido.

Solidez de las referencias de elemento

De forma predeterminada, cuando se recupera un elemento AutomationElement, se tiene acceso a todas las propiedades y los patrones de ese elemento, incluidos los que no se almacenaron en caché. Sin embargo, para obtener una mayor eficacia, puede especificar que la referencia al elemento solo haga referencia a los datos almacenados en caché si establece la propiedad AutomationElementMode del elemento CacheRequest en None. En este caso, no tiene acceso a los patrones y propiedades no almacenados en caché de los elementos recuperados. Esto significa que no se puede acceder a las propiedades a través de GetCurrentPropertyValue o la propiedad Current de AutomationElement , ni con ningún patrón de control; tampoco se puede recuperar un patrón mediante GetCurrentPattern o TryGetCurrentPattern. En los patrones almacenados en caché, puede llamar a métodos que recuperen propiedades de matriz, como SelectionPattern.SelectionPatternInformation.GetSelection, pero no puede llamar a ninguno que realice acciones en el control, como InvokePattern.Invoke.

Un ejemplo de una aplicación que podría no necesitar referencias completas a objetos es un lector de pantalla, que capturaría previamente las propiedades Name y ControlType de los elementos de una ventana, pero no necesitaría los propios objetos AutomationElement .

Activación de CacheRequest

El almacenamiento en caché solo se realiza cuando se recuperan los objetos AutomationElement mientras un elemento CacheRequest está activo para el subproceso actual. Hay dos formas de activar un elemento CacheRequest.

La manera habitual es llamar a Activate. Este método devuelve un objeto que implementa IDisposable. La solicitud permanecerá activa mientras exista el objeto IDisposable . La manera más fácil de controlar la duración del objeto es incluir la llamada dentro de un bloque using (C#) o Using (Visual Basic). Esto garantiza que la solicitud se extraerá de la pila, aunque se produzca una excepción.

Otra forma, que resulta útil cuando se quieren anidar solicitudes de almacenamiento en caché, es llamar a Push. Esto coloca la solicitud en una pila y la activa. La solicitud permanece activa hasta que se quita de la pila mediante Pop. La solicitud pasa a estar temporalmente inactiva si se inserta otra solicitud en la pila; solo la solicitud superior de la pila está activa.

Recuperación de propiedades almacenadas en caché

Puede recuperar las propiedades almacenadas en caché de un elemento mediante los siguientes métodos y propiedades.

Se produce una excepción si la propiedad solicitada no está en la caché.

Cached, como Current, expone propiedades individuales como miembros de una estructura. Sin embargo, no es necesario recuperar esta estructura; puede acceder a las propiedades individuales directamente. Por ejemplo, la propiedad Name se puede obtener de element.Cached.Name, donde element es un elemento AutomationElement.

Recuperación de patrones de control almacenados en caché

Puede recuperar los patrones de control almacenados en caché de un elemento mediante los siguientes métodos.

Si el patrón no está almacenado en caché, GetCachedPattern produce una excepción y TryGetCachedPattern devuelve false.

Puede recuperar las propiedades almacenadas en caché de un patrón de control mediante la propiedad Cached del objeto de patrón. También puede recuperar los valores actuales mediante la propiedad Current , pero solo si no se especificó None cuando se recuperó AutomationElement . (Full es el valor predeterminado y permite el acceso a los valores actuales).

Recuperación de elementos primarios y secundarios almacenados en caché

Cuando se recupera un elemento AutomationElement y se solicita almacenamiento en caché para los elementos secundarios de ese elemento mediante la propiedad TreeScope de la solicitud, es posible obtener posteriormente los elementos secundarios desde la propiedad CachedChildren del elemento que recuperó.

Si Element se incluyó en el ámbito de la solicitud de caché, el elemento raíz de la solicitud estará posteriormente disponible desde la propiedad CachedParent de cualquiera de los elementos secundarios.

Nota

No se pueden almacenar en caché los elementos primarios o antecesores del elemento raíz de la solicitud.

Actualización de la caché

La caché solo es válida siempre y cuando no cambie nada en la interfaz de usuario. La aplicación es responsable de actualizar la caché, normalmente como respuesta a eventos.

Si se suscribe a un evento mientras un elemento CacheRequest está activo, obtendrá un elemento AutomationElement con una caché actualizada como origen del evento cada vez que se llame a su delegado de controlador de eventos. También puede actualizar la información almacenada en caché de un elemento con una llamada a GetUpdatedCache. Puede pasar el elemento CacheRequest original para actualizar toda la información que se almacenó previamente en caché.

La actualización de la caché no modifica las propiedades de las referencias AutomationElement existentes.

Consulte también