Trasteando …


… con WPF y el CompositeWPF, definiendo la estructura del Shell de la aplicación, de momento se ve así:

image

Tiene zonas para:

  • Menú, la única fija va a ser la de archivo el resto se añadirán dinámicamente al cargarse los módulos de la aplicación.

image

  • Barra de herramientas, común para todas las vistas de la aplicación con las opciones típicas, nuevo, editar, borrar, etc …
  • La zona central es un TabControl, en el que se irán mostrando las vistas, los botones de Cerrar y Cerrar todo de la barra de herramientas servirán para cerrar los tabs de forma individual o en grupo.
  • Una barra de estado.

Para la carga del shell me he creado una pequeña clase base:

   1: public abstract class SmartClientApplication<TShell, TPresenter> : UnityBootstrapper
   2:     where TShell : IShellView
   3:     where TPresenter: IShellPresenter
   4: {
   5:     #region · Protected Methods ·
   6:  
   7:     protected override void ConfigureContainer()
   8:     {
   9:         Container.RegisterType<IShellView, TShell>();
  10:  
  11:         base.ConfigureContainer();
  12:     }
  13:  
  14:     protected override DependencyObject CreateShell()
  15:     {
  16:         TPresenter presenter = Container.Resolve<TPresenter>();            
  17:         presenter.ShowView();
  18:  
  19:         IShellView view = presenter.View;
  20:  
  21:         return view as DependencyObject;
  22:     }
  23:  
  24:     #endregion
  25: }

Se limita a configurar el container de Unity (DI) y mostrar la ventana del Shell de la aplicación.

La interface utilizada para la vista del Shell dispone de un único método para visualizar la ventana:

   1: public interface IShellView
   2: {
   3:     #region · Methods ·
   4:  
   5:     void ShowView();
   6:  
   7:     #endregion
   8: }

La interface para el presenter del Shell, que dispone de una propiedad para la vista asociada al presenter y un método para mostrar la ventana:

   1: public interface IShellPresenter
   2: {
   3:     #region · Properties ·
   4:  
   5:     IShellView View
   6:     {
   7:         get;
   8:     }
   9:  
  10:     #endregion
  11:  
  12:     #region · Methods ·
  13:  
  14:     void ShowView();
  15:  
  16:     #endregion
  17: }

Y por último la implementación concreta de SmartClientApplication para la aplicación, que está definida con un Singleton y solo necesita implementar ( por el momento ) la carga de los módulos de la aplicación, que de momento se hará de forma estática.

Tiene además métodos para el manejo de la excepciones no controladas que por el momento están sin implementar correctamente.

   1: public class ShellApplication : SmartClientApplication<ShellWindow, ShellPresenter>
   2: {
   3:     #region · Singleton Instance ·
   4:  
   5:     public static readonly ShellApplication Instance = new ShellApplication();
   6:  
   7:     #endregion
   8:  
   9:     #region · Constructors ·
  10:  
  11:     private ShellApplication() : base()
  12:     {
  13:     }
  14:  
  15:     #endregion
  16:  
  17:     #region · Protected Methods ·
  18:  
  19:     protected override IModuleEnumerator GetModuleEnumerator()
  20:     {
  21:         return new StaticModuleEnumerator().AddModule(typeof(ModuloConfiguracion));
  22:     }
  23:  
  24:     #endregion
  25:  
  26:     #region · Unhandled Exception ·
  27:  
  28:     public void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
  29:     {
  30:         Exception ex = e.ExceptionObject as Exception;
  31:  
  32:         if (ex != null)
  33:         {
  34:             // MessageBox.Show(this.BuildExceptionString(ex));
  35:             throw ex;
  36:         }
  37:         else
  38:         {
  39:             throw new Exception("An Exception has occured, unable to get details");
  40:             // MessageBox.Show("An Exception has occured, unable to get details");
  41:         }
  42:  
  43:         Environment.Exit(0);
  44:     }
  45:  
  46:     private string BuildExceptionString(Exception exception)
  47:     {
  48:         StringBuilder messageBuilder = new StringBuilder();
  49:  
  50:         messageBuilder.AppendFormat("{0}{1}{2}", exception.Message, Environment.NewLine, exception.StackTrace);
  51:  
  52:         while (exception.InnerException != null)
  53:         {
  54:             messageBuilder.Append(BuildInnerExceptionString(exception.InnerException));
  55:  
  56:             exception = exception.InnerException;
  57:         }
  58:  
  59:         return messageBuilder.ToString();
  60:     }
  61:  
  62:     private string BuildInnerExceptionString(Exception innerException)
  63:     {
  64:         StringBuilder messageBuilder = new StringBuilder();
  65:  
  66:         messageBuilder.AppendFormat("{0}{1}", Environment.NewLine, " InnerException ");
  67:         messageBuilder.AppendFormat("{0}{1}{2}{3}", Environment.NewLine, innerException.Message, Environment.NewLine, innerException.StackTrace);
  68:  
  69:         return messageBuilder.ToString();
  70:     } 
  71:  
  72:     #endregion
  73: }

Un Comentario

  1. Pingback: Estados de las vistas « Carliños Blog


Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s