2011-12-02 8 views
5

Estoy buscando una "mejor práctica" (si es que hay una mejor) para cerrar una aplicación WPF que utiliza MEF y PRISM4. En definitiva, estoy buscando algún tipo de "Servicio cerrado" que gestione todo el evento/comando desde el Shell a cualquier modelo de vista (u otros suscriptores) que quiera verificar que esté bien cerrar la aplicación. ¿El agregador de eventos es la manera más limpia? Otras opiniones/opciones?Agraciado cierre de la aplicación usando WPF PRISM 4

Idealmente, tendría un botón en mi ToolbarView en mi ToolbarRegion (1 de 2 regiones en mi Shell). Este botón invocaría un comando en mi ToolbarViewModel (haciendo referencia a un comando en mi ToolbarControler) que a su vez haría dos cosas (¿creo?) ... Primero, notifique a todos los suscriptores que es la hora de cierre y permita que cualquiera de ellos cancele el cierre y ... en segundo lugar, si ninguno se cancela, de alguna manera se notifica al shell para que se cierre. El modo de desconexión de mi aplicación está configurado en "ShutdownMode.OnMainWindowClose", por lo que si el Shell se cierra, debería estar todo listo.

¿Alguien me puede ayudar con esto?

Respuesta

3

Estoy desarrollando una aplicación de gran tamaño utilizando la misma materia: MEF y PrismV4

que manejan el apagado un poco diferente:
en el Shell, hay una región "Herramientas", interrupciones para que se maneja justo en el Shell, en el evento cerrado.
Luego, para todo lo que se inyectó en la otra región, que es un tabcontrol, echo el contenido como IDisposable, y cierro cada pestaña una por una. (En realidad, no es un tabcontrol, es un componente avalondock, pero es lo mismo realmente).
Por supuesto, tendrá que implementar IDisposable en cada clase que tenga referencias, etc. para eliminar, pero es difícil pensar en una "forma limpia de apagar" sin querer decir que la interfaz es correcta. =)

Ahora, sobre el EventAggregator: es posible que tengas problemas, porque no hay acoplamiento: puedes disparar un evento débil a través de él, pero no puedes esperar a que los objetos hagan su trabajo después de eso.
Y luego, no puede crear un mecanismo para cancelar el apagado.

En caso de que quiera sus diferentes puntos de vista para poder cancelar la parada, le sugiero que crear una interfaz con un solo método en el que:

public interface IShutdownAware 
{ 
    bool CanShutdown(); 
} 

Luego a la derecha antes de llamar a disponer, llama CanShutdown(); si todos devuelven la verdad, proceda con la eliminación, de lo contrario, cancele el proceso de apagado.

+0

Me gusta este método, pero todavía tengo una pregunta. ¿Cómo hace un seguimiento de sus vistas activas (o ve modelos)? ¿En qué colección iteras para llamar a "CanShutdown()"? ¿Utiliza IRegionManager y consulta vistas activas? – Thelonias

+1

Dado que haría eso en el Shell, podría simplemente consultar el contenido de los diversos elementos de diseño que tiene en el Shell e iterar sobre ellos. Probablemente también sea posible con IRegionManager, intente y vea qué funciona mejor en su escenario. –

Cuestiones relacionadas