2012-09-20 19 views
13

Estoy recién aprendiendo WPF y Caliburn.Micro. Estoy siguiendo el código que se presenta aquí: http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper&referringTitle=DocumentationCaliburn.Micro y MEF en wpf

Aparentemente, este código es para Silverlight pero mi proyecto es un WPF y por este motivo recibo el error de que CompositionHost no está definido.

El documento indica que necesito inicializar el contenedor directamente en wpf, pero no hay ningún documento que muestre cómo hacerlo. ¿Cómo puedo inicializar el contenedor directamente?

Editar 1 La flejadora de arranque es como esto en la documentación:

 container = CompositionHost.Initialize(
     new AggregateCatalog(
      AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>() 
      ) 
     ); 

    var batch = new CompositionBatch(); 

    batch.AddExportedValue<IWindowManager>(new WindowManager()); 
    batch.AddExportedValue<IEventAggregator>(new EventAggregator()); 
    batch.AddExportedValue(container); 

    container.Compose(batch); 

y yo lo convirtió a:

var catalog = 
      new AggregateCatalog(
       AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()); 

     this.container = new CompositionContainer(catalog); 
     var batch = new CompositionBatch(); 

     batch.AddExportedValue<IWindowManager>(new WindowManager()); 
     batch.AddExportedValue<IEventAggregator>(new EventAggregator()); 
     batch.AddExportedValue(this.container); 

     this.container.Compose(batch); 

Pero cuando corro solicitud, estoy consiguiendo error que el MEF no puede encontrar implementación para IShell

 Could not locate any instances of contract IShell. 

Creo en mi inicialización de M EF no es correcto ¿Puedes ayudarme a arreglarlo?

Respuesta

17

En WPF necesita usar un constructor CompositionContainer explícito. En mi WPF y programa previo compartida Silverlight He utilizado el siguiente #if-#else Directiva:

#if SILVERLIGHT 
    container = CompositionHost.Initialize(catalog); 
#else 
    container = new CompositionContainer(catalog); ; 
#endif 

EDITAR

El programa previo identificará un componente que implementa la interfaz IShell (siempre que su programa previo está extendiendo el Bootstrapper<IShell> clase base), por lo que debe implementar una clase decorada con exportación MEF de IShell.

Normalmente, esto sería su ShellViewModel y la declaración se vería así:

[Export(typeof(IShell))] 
public class ShellViewModel : PropertyChangedBase, IShell 
{ 
    ... 
} 

Usted puede leer mucho más acerca de la configuración y personalización de programas previos here.

+0

Gracias. Por favor, mira mi edición a la pregunta. – mans

+0

@mans Por favor vea mi actualización de respuesta. –