Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
Esta documentación está pensada para desarrolladores de .NET Framework que desean usar las clases de automatización de la interfaz de usuario administradas definidas en el espacio de nombres System.Windows.Automation. Para obtener la información más reciente sobre la automatización de la interfaz de usuario, consulte API de Windows Automation: Automatización de la interfaz de usuario.
En este tema se presenta el almacenamiento en caché de propiedades y patrones de control de automatización de la interfaz de usuario.
En automatización de la interfaz de usuario, el almacenamiento en caché significa la captura previa de datos. A continuación, se puede acceder a los datos sin una comunicación entre procesos adicionales. Normalmente, las aplicaciones cliente de Automatización de la interfaz de usuario usan el almacenamiento en caché para recuperar propiedades y patrones de control de forma masiva. A continuación, la información se recupera de la memoria caché según sea necesario. La aplicación actualiza la memoria caché periódicamente, normalmente en respuesta a eventos que significan que algo en la interfaz de usuario (UI) ha cambiado.
Las ventajas del almacenamiento en caché son más notables con los controles de Windows Presentation Foundation (WPF) y los controles personalizados que tienen proveedores de automatización de la interfaz de usuario del lado servidor. Hay menos ventajas al acceder a proveedores del lado cliente, como los proveedores predeterminados para los controles Win32.
El almacenamiento en caché se produce cuando la aplicación activa CacheRequest y luego usa cualquier método o propiedad que devuelva un AutomationElement; por ejemplo, FindFirst, FindAll. Los métodos de la TreeWalker clase son una excepción; el almacenamiento en caché solo se realiza si CacheRequest se especifica como parámetro (por ejemplo, TreeWalker.GetFirstChild(AutomationElement, CacheRequest).
El almacenamiento en caché también se produce cuando se suscribe a un evento mientras está CacheRequest activo. El AutomationElement objeto pasado al controlador de eventos como origen de un evento contiene las propiedades y patrones almacenados en caché especificados por el objeto original CacheRequest. Los cambios realizados en CacheRequest después de suscribirse al evento no tienen ningún efecto.
Las propiedades y los patrones de control de la automatización de la interfaz de usuario de un elemento se pueden almacenar en caché.
Opciones para el almacenamiento en caché
CacheRequest especifica las siguientes opciones para el almacenamiento en caché.
Propiedades para almacenar en caché
Puede especificar las propiedades que se van a almacenar en caché llamando Add(AutomationProperty) a cada propiedad antes de activar la solicitud.
Patrones de control para almacenar en caché
Puede especificar patrones de control para almacenar en caché llamando Add(AutomationPattern) a cada patrón antes de activar la solicitud. Cuando se almacena en caché un patrón, sus propiedades no se almacenan automáticamente en caché; debe especificar las propiedades que desea almacenar en caché mediante CacheRequest.Add.
Ámbito y filtrado del almacenamiento en caché
Puede especificar los elementos cuyas propiedades y patrones desea almacenar en caché estableciendo la CacheRequest.TreeScope propiedad antes de activar la solicitud. El ámbito es relativo a los elementos que se recuperan mientras la solicitud está activa. Por ejemplo, si establece solo Childreny, a continuación, recupera una AutomationElement, las propiedades y los patrones de elementos secundarios de ese elemento se almacenan en caché, pero no los del propio elemento. Para asegurarse de que el almacenamiento en caché se realiza para el propio elemento recuperado, debe incluir Element en la TreeScope propiedad . No es posible establecer el ámbito a Parent o a 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é solo se realiza para los elementos que aparecen en la vista de control del árbol de 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 elementos que aparecen en la vista de contenido.
Solidez de las referencias de elemento
Al recuperar un AutomationElement, de forma predeterminada tiene acceso a todas las propiedades y patrones de ese elemento, incluidos los que no se almacenaron en caché. Sin embargo, para una mayor eficiencia, puede especificar que la referencia al elemento se refiera solo a los datos almacenados en caché estableciendo la propiedad AutomationElementMode de CacheRequest en None. En este caso, no tiene acceso a ninguna propiedad y patrones no almacenados en caché de elementos recuperados. Esto significa que no se puede tener acceso a ninguna propiedad a través de GetCurrentPropertyValue ni a la propiedad Current
de AutomationElement ni a 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 recuperan propiedades de matriz, como SelectionPattern.SelectionPatternInformation.GetSelection, pero no a las que realizan 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 Name propiedades y ControlType de los elementos de una ventana, pero no necesitaría los AutomationElement propios objetos.
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 maneras de activar un CacheRequest.
La forma habitual es llamar Activate. Este método devuelve un objeto que implementa IDisposable. La solicitud permanece activa siempre que el IDisposable objeto exista. La manera más fácil de controlar la duración del objeto es incluir la llamada dentro de un using
bloque (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 se vuelve 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 métodos y propiedades siguientes.
Se produce una excepción si la propiedad solicitada no está en la memoria caché.
Cached, como Current, expone propiedades individuales como miembros de una estructura. Sin embargo, no es necesario recuperar esta estructura; puede acceder directamente a las propiedades individuales. Por ejemplo, la Name propiedad se puede obtener de element.Cached.Name
, donde element
es .AutomationElement
Recuperación de patrones de control almacenados en caché
Puede recuperar los patrones de control almacenados en caché de un elemento mediante los métodos siguientes.
Si el patrón no está en la memoria caché, GetCachedPattern genera una excepción y TryGetCachedPattern devuelve false
.
Puede recuperar las propiedades almacenadas en caché de un patrón de control mediante la Cached
propiedad del objeto pattern. También puede recuperar los valores actuales a través de la Current
propiedad , pero solo si None no se especificó cuando AutomationElement se recuperó . (Full es el valor predeterminado y esto 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á disponible posteriormente desde la CachedParent propiedad 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 memoria caché solo es válida siempre que no cambie nada en la interfaz de usuario. La aplicación es responsable de actualizar la memoria caché, normalmente en 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 llamando 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 ninguna referencia existente AutomationElement .