Ciclo de vida.

El ciclo de vida es el cojunto de estados por los que pasa un control a lo largo del tiempo de ejecución de una aplicación. Hasta el momento en el que un control cualquiera se hace visible en la pantalla del usuario, éste ha pasado por una serie de estados previos que han ido conformando aspectos como su creación, su configuración, su disposición en la pantalla, etc. Estos procesos previos a su visualización final pueden sernos de gran utilidad para realizar tareas sobre ellos y así conformar su estado final.

Ciclo de vida de una ventana.

Por ejemplo, cuando se crea una ventana, ésta se agrega automáticamente a la colección de ventanas referenciada por la propiedad 'Windows' del objeto 'Application'. Si además se trata de la primera ventana, se establece, de forma predeterminada, como la ventana principal de la aplicación, asignando su referencia a la propiedad 'MainWindow' del objeto 'Application', quedando implícito en la propiedad 'StartupUri' en el archivo 'App.xaml'. Abre este archivo y crompuébalo.

Es por esto que, al inicio de la aplicación, la ventana especificada por la propiedad 'StartupUri' se abre automáticamente de forma no modal (internamente, la ventana se abre con una llamada al método 'Show'). Al tratarse de una ventana no modal, ésta permite al usuario activar otras ventanas en la misma aplicación, cosa que no podríamos hacer si se produjera una llamada al método 'ShowDialog' de una ventana modal.

Una vez llamado al método para abrir una ventana no modal, se activa su ciclo de vida, generándose primeramente el evento 'Activated'. Una ventana activa es aquella que está capturando los datos proporcionados por el usuario, tales como las teclas pulsadas y los clicks del ratón.

A continuación se generan los eventos 'Loaded' y, posteriormente, 'ContentRendered', en ese orden. En el momento que se produce este último evento, puede considerarse la ventana como abierta y visible.

¿Y todo esto para qué? Pues vamos a un ejemplo. Tenemos una aplicación de gestión que hace uso de varias bases de datos. Lógicamente, la aplicación necesitará hacer uso de estas bases de datos en multitud de ocasiones, y necesita toas las bases de datos, no puede funcionar sin ellas. Sin una de las bases de datos,, por ejemplo, ha sido eliminada, cuando la aplicación intente hacer uso de ella se producirá un error fatal que desembocará en un "cuelgue" fatal sin solución, algo a lo que siempre hay que estar preparado para que no se produzca. Solución: la aplicación se inicia y, antes de que la venttana principal sea visible, por ejemplo, en el evento 'Activated', comprobaremos la existencia de las bases de datos e, incluso, intentaremos una conexión a las mismas mediante un bloque de código 'try-catch'; en ese momento, de no ser posible la conexión, interrumpiremos la aplicación llamando al método 'Application.Current.Shutdown()' e informaremos al usuario del problema, protegiendo así a la aplicación de una interrupción fatal. Otro ejemplo podría ser el siguiente: antes de visualizar la ventana principal, y teniendo oen cuenta el idioma de la aplicación, cargaremos los archivos de recursos necesarios para el idioma indicado, de tal manera que XAML cargará las cadenas de texto de ese idioma y solamente visualizará ese idioma en el momento de la visualización; veremos más adelante cómo hacer una aplicación multiidioma.

El ciclo de vida de una ventana no se interumpe ahí. En el momento de cerrar una ventana, sea o no principal, el ciclo de vida continúa con el eventoo 'Deactivated'. (Incluso en ese momento podrá activarse de nuevo mediante una llamada al método 'Activated' y todo seguiría igual). Después de desactivarse la ventana, se produce el evento 'Closing', en el que la ventana se ha desactivado pero aún no se ha cerrado y, posteriormente, el evento 'Closed', que como su propio nombre indica, la ventana ha sidoo cerrada sin posibilidad de detener la acción. Es en esos eventos cuando podemos realizar acciones como, por ejemplo, guardar parámetros de configuración de la ventana o de la aplicación que puedan ser útilies en el futuro.

Repasemos los métodos que pueden ser útiles en referencia al ciclo de vida de una ventana:

'Activate': activa la ventana situándola en primer plano; se produce el evento 'Activated'.

'Deactivate': desactiva la ventana; se produce el evento 'Deactivated'.

'Close': cierra la ventana; se produce el evento 'Closing' y, posteriormente, el vento 'Closed', eliminándose los recursos administrados por el objeto 'Window'.

Show: muestra una ventana sin impedir que el usuario interactúe con las otras ventanas de la aplicación.

ShowDialog: muestra una ventana impidiendo que el usuario interactúe con las otras ventanas de la aplicación.

Hide: oculta una ventana, pero no la cierra, repito, no la cierra; únicamente cambia el valor de la propiedad 'Visibility' de esa ventana.

Mediante Visual Studio, en la ventana de propiedades de cada control, podrás ver que todos y cada uno de los controles, en el apartado de sus eventos, tienen prácticamente los mismos eventos de su cicloo de vida al igual que las ventanas. Esto nos permite tener un control sobre los procesos de ciclo de vida de los controles por separado y actuar sobre ellos según nuestra conveniencia.

Ciclo de vida de una aplicación.

Al igual que hemos visto anteriormente en el caso de las ventanas, una aplicación también tiene su propio ciclo de vida. Cuando ésta se ejecuta, se hace una llamada al método 'Run' y se genera el evento 'Startup' del objeto 'Application'. Luego se efectúa una llamada al evento 'Activated' y, si la aplicación pasara a segundo plano, se llamaría al evento 'Deactivated'. Finalmente, cuando la aplicación se cierra, se llama al evento 'Exit'.