2010-06-28 7 views
8

필자는 셸 창과 contentcontrol 인 하나의 주 영역에 일련의 탭을 가지고 있습니다. 특정 탭을 선택했을 때 필요시로드 할 4 개의 모듈도 있습니다. 따라서 tab1을 선택하면 module2를로드 할 때 moduleA를로드하려고합니다. ModuleB 등을로드하려고합니다. 응용 프로그램이 시작될 때 첫 번째 모듈이로드됩니다. 문제는 탭을 변경할 때 아무 일도 일어나지 않는다는 것입니다. 힘든 오류는 없습니다.PRISM 및 WPF 요청시 모듈을 추가하는 방법

쉘 :

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

부트 스트 래퍼 :

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

} 

나는이 방법을 시도 2009 년 10 월

- 나는 WPF와 실버 라이트 프리즘 복합 응용 프로그램 지침이 버전을 사용하고 있습니다 그리고 moduleB는 내가 원하는대로로드 할 수 있기를 바란다. (나는이 주석 라인을 사용했기 때문에 여기에서 그 것을 사용했다.)

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

여기서 내가 뭘 잘못하고 있니? 어떻게해야합니까?

+0

을하는 데 도움이 내가 거의 같은 시나리오가를 SE는. 내 질문 +1 – autonomatt

답변

0

내가 아주 확실하지 않다하지만 모듈을 추가 할 때과 같이, 온 디맨드하는 InitializationMode을 설정하려고 : 내가 성공적으로 모듈의 온 디맨드 로딩을 ​​사용하고

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

. 내 시나리오에서는 사용자가 로그인 한 후에로드합니다.

프로젝트의 정상 확인으로 ModuleB.dll이 쉘/응용 프로그램과 동일한 디렉토리에 있는지 확인하십시오. (예를 들어, 디버그 모드에있는 경우 디버그 디렉토리로 복사되는지 확인하십시오).

모듈 이름과 모듈 dll이 같은 이름을지었습니다. 요구 사항인지 확실하지 않습니다.하지만 그 규칙은 제가 고집 한 것입니다.

내 bootstrappers CreateModuleCatalog 내가이 코드

IModuleManager moduleManager = _container.Resolve<IModuleManager>(); 
    ModulesConfigurationSection modules = ConfigurationManager.GetSection("modules") as ModulesConfigurationSection; 
    foreach (ModuleConfigurationElement module in modules.Modules) 
     moduleManager.LoadModule(module.ModuleName); 
을 사용하는 모듈을로드 할 때
protected override IModuleCatalog CreateModuleCatalog() 
{ 
    ModuleCatalog catalog = new ConfigurationModuleCatalog(); 
    return catalog; 

} 

모듈

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

다음 내 app.config 파일에 나와있는 매우 간단합니다

모듈로드는 GUI 스레드에서 이루어져야하므로 필요한 경우 다음을 수행해야합니다. 로딩을 할 수있는 디스패처 (이것은 내가 그것을 사용하는 라인)

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

희망이