2010-06-28 16 views
8

Tengo un conjunto de pestañas en la ventana de mi shell y una región principal que es un control de contenido. También tengo cuatro módulos que deseo cargar bajo demanda cuando se selecciona una determinada pestaña. Entonces, cuando se selecciona tab1, quiero cargar el módulo A, cuando se selecciona tab2, quiero cargar el ModuleB, etc. El primer módulo se carga cuando se inicia la aplicación. El problema es que cuando cambio la pestaña no pasa nada. No hay errores difíciles. Estoy usando esta versión del prisma Compuesto Guía de aplicación para WPF y Silverlight - octubre de 2009.PRISM y WPF cómo agregar un módulo bajo demanda

Probé este enfoque:

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

programa previo:

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

} 

Y el módulo B que quiero cargar a pedido (solía usar esta línea comentada por eso lo dejé aquí):

[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>(); 
    } 
} 

¿Qué estoy haciendo mal aquí? ¿Cómo debo proceder?

+0

tengo más o menos el mismo escenario. +1 por una pregunta mía – autonomatt

Respuesta

0

No estoy muy seguro, pero trato de establecer el InitializationMode a OnDemand al agregar el módulo, así:

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

estoy utilizando con éxito la carga de módulos on-demand. en mi caso, los cargo después de que el usuario inicia sesión.

Como comprobación de cordura con su proyecto, asegúrese de que su ModuleB.dll se encuentre en el mismo directorio que su shell/aplicación. (por ejemplo, asegúrese de que se copie en el directorio de depuración si se encuentra en modo de depuración).

Tengo el nombre del módulo y el dll del módulo llamado igual, no estoy seguro de si esto es un requisito, pero es la convención con la que me he pegado.

mis bootstrappers CreateModuleCatalog es muy simple

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

} 

los módulos se enumeran en mi archivo app.config

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

luego, cuando me carga los módulos utilizo este código

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

La carga de módulos tiene que ocurrir en el hilo de la GUI, por lo que si es necesario, debe SE La despachador para hacer la carga (esta es la línea que utilizo para ello)

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

esperanza esto ayuda

Cuestiones relacionadas