2010-06-28 22 views
8

Kabuk penceremde bir sekmeler kümesi ve bir ana bölge, bir içerik denetleyicisi. Belli bir sekme seçildiğinde isteğe bağlı olarak yüklemek istediğim dört modül var. Bu yüzden tab1 seçildiğinde, module2'yi yüklemek istiyorum, tab2 seçildiğinde ModuleB'yi yüklemek istiyorum, vs. Uygulama başladığında ilk modül yüklenir. Sorun şu ki, sekmeyi değiştirdiğimde hiçbir şey olmuyor. Zor olmayan hatalar var.PRISM ve WPF isteğe bağlı bir modül nasıl eklenir

Kabuk:

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

} 

Ben bu yaklaşımı denedik Ekim 2009.

- WPF ve Silverlight için prizma Kompozit Uygulama Rehberlik bu sürümünü kullanıyorum Ve talep üzerine yükleyebilmek istediğim modülB (bu yorumlu satırı kullandım, bu yüzden onu burada bıraktım):

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

yanlış burada ne yapıyorum? Nasıl ilerlemeliyim?

+0

yardımcı olur ben hemen hemen aynı senaryo var se. Benden soru için +1 – autonomatt

cevap

0

Pek emin değilim ama modülü eklerken şöyle, istek üzerine yayın için InitializationMode ayarlamak için deneyin: i başarıyla modüllerin ondemand yükleme kullanıyorum

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

. Benim senaryoda, kullanıcı oturum açtıktan sonra bunları yüklerim.

Projeniz ile bir akıl sağlığı kontrolü olarak, ModuleB.dll dosyanızın kabuk/uygulama ile aynı dizinde olduğundan emin olun. (örneğin, hata ayıklama modundaysanız, hata ayıklama dizinine kopyalandığından emin olun).

Modülün adı ve modülü dll olarak adlandırılmış, bunun bir gereklilik olup olmadığından emin değilim, ancak onun içinde kaldığım kongre.

benim bootstrappers CreateModuleCatalog i bu kodu

IModuleManager moduleManager = _container.Resolve<IModuleManager>(); 
    ModulesConfigurationSection modules = ConfigurationManager.GetSection("modules") as ModulesConfigurationSection; 
    foreach (ModuleConfigurationElement module in modules.Modules) 
     moduleManager.LoadModule(module.ModuleName); 
kullanmak modülleri yüklediğinizde
protected override IModuleCatalog CreateModuleCatalog() 
{ 
    ModuleCatalog catalog = new ConfigurationModuleCatalog(); 
    return catalog; 

} 

modüllerin

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

sonra benim app.config dosyasında listelenen çok basittir

Modüllerin yüklenmesi GUI iş parçacığı üzerinde gerçekleşmelidir, bu yüzden gerekirse yükleme yapmak dağıtıcınızın (bu i için kullanmak çizgidir)

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

umut bu

İlgili konular