2012-09-20 13 views
13

Sto solo imparando WPF e Caliburn.Micro. Sto seguendo il codice che qui presentata: http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper&referringTitle=DocumentationCaliburn.Micro e MEF su wpf

A quanto pare questo codice è per Silverlight, ma il mio progetto è un WPF e per questo motivo sto errore che CompositionHost non è definito ottenendo.

Il documento afferma che è necessario inizializzare il contenitore direttamente in wpf, ma non c'è alcun documento che mostri come. Come posso inizializzare il container direttamente?

Modifica 1 Lo Strapper avvio è come questo nella documentazione:

 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); 

e ho convertito 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); 

Ma quando corro applicazione, io sono sempre errore che MEF non può trova implementazione per IShell

 Could not locate any instances of contract IShell. 

Credo che la mia inizializzazione di M EF non è corretto. Potete per favore aiutarmi a risolverlo?

risposta

17

In WPF è necessario utilizzare un costruttore esplicito CompositionContainer. Nel mio WPF e Silverlight bootstrapper condiviso ho usato il seguente #if - direttiva #else:

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

EDIT

Il programma di avvio automatico identificherà un componente che implementa l'interfaccia IShell (a condizione che il programma di avvio automatico sta estendendo la Bootstrapper<IShell> classe base), quindi è necessario implementare una classe decorato con l'esportazione MEF di IShell.

In genere questo sarebbe la vostra ShellViewModel e la dichiarazione sarebbe simile a questa:

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

Si può leggere molto di più sulla configurazione di avvio automatico e la personalizzazione here.

+0

Grazie. Si prega di vedere la mia modifica alla domanda. – mans

+0

@mans Si prega di vedere il mio aggiornamento risposta. –