2011-01-06 4 views
2

Ich möchte Module laden, wenn meine App lädt und sie ihre Ansichten in eine region (siehe auch this MSDN article) in der Shell (die Hauptansicht). Ich lade gerade ein Modul auf Anfrage und es funktioniert gut. (I laden Sie das Modul mit einer Schaltfläche, die this.moduleManager.LoadModule("ModuleB"); nennt, wo moduleManager als [Import(AllowRecomposition = false)] private IModuleManager moduleManager; definiert Dies alles kommt aus der ModularityWithMef.Desktop Beispielanwendung..) Hier ist der entsprechende Code:Anzeigen von Modulen in einer Prism-Region, wenn verfügbar

Modul

[ModuleExport(typeof(ModuleB), InitializationMode = InitializationMode.OnDemand)] 
public class ModuleB : IModule 
{ 
    [Import(AllowRecomposition = false)] private IRegionManager _regionManager; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="ModuleB"/> class. 
    /// </summary> 
    public ModuleB() 
    { 
    } 

    /// <summary> 
    /// Notifies the module that it has be initialized. 
    /// </summary> 
    public void Initialize() 
    { 
     _regionManager.AddToRegion("ContentRegion", new ModuleBView()); 
    } 
} 

XAML Region

<TabControl Regions:RegionManager.RegionName="ContentRegion" /> 

Wenn ich zum Laden des Moduls wechsle, wenn verfügbar ([ModuleExport(typeof(ModuleB), InitializationMode = InitializationMode.WhenAvailable)]), bekomme ich eine ModuleInitializeException, wenn der Bootstrapper die Shell erstellt und sagt: "Dieser RegionManager enthält keine Region mit dem Namen 'ContentRegion'." Dies sagt mir, dass es ein Timing-Problem mit der Erstellung der Region in der Shell und der Initialisierung des Moduls gibt.

Also hier ist meine Frage: Wie registriere ich die Ansicht des Moduls mit der Region der Shell nach Entdeckung und ohne OnDemand Initialisierung zu verwenden und das Modul manuell zu laden?

Antwort

2

Nun, das war eine einfache Antwort, die aus irgendeinem Grund für mich schwer zu finden war. Die IRegionManager bietet eine RegisterViewWithRegion Methode, die eine Funktion übernimmt, die die Ansicht zurückgibt. Dadurch kann der Regionsmanager die Ansicht instanziieren, wenn sie bereit ist (im Gegensatz zur Verwendung von AddToRegion, die sofort erfolgt). So ist der Schlüssel diese Methode zu verwenden, in der Initialize Routine des Moduls:

public void Initialize() 
{ 
    _regionManager.RegisterViewWithRegion("ContentRegion",() => new ModuleBView()); 
} 

Während ich dies aus war herauszufinden, kam ich auch mit einer Vermeidung des Problems auf. Wenn das Modul auf InitializationMode.OnDemand eingestellt ist, kann die Shell IModuleManager importieren und LoadModule im ContentRendered-Ereignis verwenden. Dies stellt sicher, dass die Region zum Regionsmanager hinzugefügt wurde und dass das Modul seine Ansicht problemlos hinzufügen kann. Wenn Sie durch die verfügbaren Module laufen müssen, verwenden Sie diese Event-Handler:

public Shell() 
{ 
    InitializeComponent(); 

    ContentRendered += (o, eventArgs) => 
     { 
      foreach (var moduleInfo in _moduleCatalog.Modules) 
      { 
       _moduleManager.LoadModule(moduleInfo.ModuleName); 
      } 
     }; 
} 
+0

Danke für das Posten. :) – VipX1

0

Ich neige dazu, Ansichten und die Region in der Bootstrap fröhlich, in der _handler AggregateCatalog.Changed - das ist, wo Sie wissen, dass Ihr Modul ist bereits geladen und Shell ist bereits mit allen Modulen instanziiert.

Verwandte Themen