2010-06-28 8 views
8

Ho una serie di schede nella finestra della mia shell e una regione principale che è un contentcontrol. Ho anche quattro moduli che voglio caricare su richiesta quando viene selezionata una determinata scheda. Quindi, quando viene selezionato tab1, voglio caricare moduleA, quando viene selezionato tab2, voglio caricare ModuleB, ecc. Il primo modulo si carica all'avvio dell'applicazione. Il problema è che quando cambio la scheda non succede nulla. Non ci sono errori difficili. Sto utilizzando questa versione del prisma Composite Application Guidance per WPF e Silverlight - ottobre 2009.PRISM e WPF come aggiungere un modulo su richiesta

Ho provato questo approccio:

Shell:

public partial class Shell : RibbonWindow, IShellView 
    { 
     private readonly IRegionManager regionManager; 
     private readonly IModuleManager moduleManager; 

    public Shell(IModuleManager moduleManager) 
    { 
     this.moduleManager = moduleManager; 
     InitializeComponent(); 

    } 

    public void ShowView() 
    { 
     this.Show(); 
    } 



    private void onTabSelection(object sender, RoutedEventArgs e) 
     { 
       this.moduleManager.LoadModule("ModuleB"); 
     } 
} 

Bootstrapper:

public partial class MyBootstrapper : UnityBootstrapper 
    { 
     protected override IModuleCatalog GetModuleCatalog() 
     { 
      var catalog = new ModuleCatalog(); 
      catalog.AddModule(typeof(ModuleA)).AddModule(typeof(ModuleB)); 

     return catalog; 
    } 

    protected override void ConfigureContainer() 
    { 
     Container.RegisterType<IShellView, Shell>(); 

     base.ConfigureContainer(); 
    } 



    protected override DependencyObject CreateShell() 
    { 
     ShellPresenter presenter = Container.Resolve<ShellPresenter>(); 
     IShellView view = presenter.View; 

     view.ShowView(); 

     return view as DependencyObject; 
    } 

} 

E moduloB che voglio essere in grado di caricare su richiesta (ho usato questa linea commentata per questo l'ho lasciato qui):

[Module(ModuleName = "ModuleB", OnDemand = true)] 
public class ModuleB : IModule 
{ 

    private readonly IUnityContainer _container; 
    private readonly IRegionManager _regionManager; 

    public ModuleB(IUnityContainer container, IRegionManager regionManager) 
    { 
     _container = container; 
     _regionManager = regionManager; 
    } 
    public void Initialize() { 

     _regionManager.Regions["MainRegion"].Add(new ModuleBView()); 
     this.RegisterViewsAndServices(); 

     // this._regionManager.RegisterViewWithRegion(RegionNames.MainRegion,() => _container.Resolve<MissionProfileView>()); 
    } 
    protected void RegisterViewsAndServices() 
    { 
     _container.RegisterType<Modules.ModuleBView>(); 
    } 
} 

Cosa sto facendo di sbagliato qui? Come dovrei procedere?

+0

ho più o meno lo stesso scenario. +1 per la domanda da parte mia – autonomatt

risposta

0

io non sono molto sicuro, ma cerco di impostare l'InitializationMode a OnDemand quando si aggiunge il modulo, in questo modo:

var catalog = new ModuleCatalog(); 
catalog.AddModule(typeof(ModuleA)).AddModule(typeof(ModuleB), InitializationMode.OnDemand); 
3

adesso utilizzo carico ondemand di moduli. nel mio scenario, li carico dopo che l'utente esegue il login.

Come controllo di integrità con il progetto, assicurarsi che ModuleB.dll si trovi nella stessa directory della shell/dell'applicazione. (per esempio assicurati che venga copiato nella directory di debug se sei in modalità di debug).

Ho il nome del modulo e la dll del modulo lo stesso, non sono sicuro se questo è un requisito, ma è la convenzione che ho bloccato con.

miei bootstrappers CreateModuleCatalog è molto semplice

protected override IModuleCatalog CreateModuleCatalog() 
{ 
    ModuleCatalog catalog = new ConfigurationModuleCatalog(); 
    return catalog; 

} 

i moduli sono elencati nel mio file app.config

<modules> 
    <module assemblyFile="PatronModule.dll" moduleType="PatronModule.PatronModuleDefinition, PatronModule" moduleName="PatronModule" startupLoaded="false" /> 
</modules> 

poi quando ho caricare i moduli io uso questo codice

IModuleManager moduleManager = _container.Resolve<IModuleManager>(); 
    ModulesConfigurationSection modules = ConfigurationManager.GetSection("modules") as ModulesConfigurationSection; 
    foreach (ModuleConfigurationElement module in modules.Modules) 
     moduleManager.LoadModule(module.ModuleName); 

Il caricamento dei moduli deve avvenire sul thread GUI, quindi se necessario è necessario SE il dispatcher per fare il carico (questa è la linea che uso per esso)

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() => { LoadModulesOnGuiThread(); })); 

speranza che questo aiuta

Problemi correlati