所有模块加载后是否可以显示shell?

Hus*_*lil 6 .net c# wpf prism

我目前正在开发一个使用PRISM 4在不同模块中划分其功能的应用程序.

我注意到我的应用程序的Shell在模块加载之前加载并显示了模块在其区域中的视图.

这意味着首先显示Shell,并且稍后(大约半秒)显示Shell,加载模块并将视图插入Shell的区域.这是相当烦人的,因为用户在启动时遇到空壳,这不是很专业.

有没有办法检测何时加载了所有模块?我可以在引导程序中覆盖的任何方法?

如果可以,我想隐藏Shell(或显示加载装饰器),直到所有模块都已加载.

Ond*_*rej 7

初始化模块后,您可以显示Shell视图:

protected override void InitializeShell()
{
   Application.Current.MainWindow = (Window)Container.Resolve<ShellView>();
}

protected override void InitializeModules()
{
   base.InitializeModules();
   Application.Current.MainWindow.Show();
}
Run Code Online (Sandbox Code Playgroud)


Hus*_*lil 3

我找到了一个相对简单的解决方案。

我的应用程序有一个名为 ShellHandler 的类,它在引导程序中实例化并在 Unity 容器中注册为单例:

Container.RegisterType<IShellHandler, ShellHandler>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)

我在 ShellHandler 中创建了一个方法,模块可以使用该方法将自己标记为已加载:

 /// <summary>
 /// Method used to increment the number of modules loaded.
 /// Once the number of modules loaded equals the number of modules registered in the catalog,
 /// the shell displays the Login shell.
 /// This prevents the scenario where the Shell is displayed at start-up with empty regions,
 /// and then the regions are populated as the modules are loaded.
 /// </summary>
 public void FlagModuleAsLoaded()
 {
     NumberOfLoadedModules++;

     if (NumberOfLoadedModules != ModuleCatalog.Modules.Count()) 
         return;

     // Display the Login shell.
     DisplayShell(typeof(LoginShell), true);
 }
Run Code Online (Sandbox Code Playgroud)

最后,在所有模块都实现的 ModuleBase 类中,我创建了一个在初始化过程中调用的抽象方法:

 /// <summary>
 /// Method automatically called and used to register the module's views, types, 
 /// as well as initialize the module itself.
 /// </summary>
 public void Initialize()
 {
     // Views and types must be registered first.
     RegisterViewsAndTypes();

     // Now initialize the module.
     InitializeModule();

     // Flag the module as loaded.
     FlagModuleAsLoaded();
 }

 public abstract void FlagModuleAsLoaded();
Run Code Online (Sandbox Code Playgroud)

现在,每个模块都通过其构造函数解析 ShellHandler 单例的实例:

 public LoginModule(IUnityContainer container, IRegionManager regionManager, IShellHandler shellHandler) 
        : base(container, regionManager)
 {
      this.ShellHandler = shellHandler;
 }
Run Code Online (Sandbox Code Playgroud)

最后他们实现了 ModuleBase 中的 Abstract 方法:

 /// <summary>
 /// Method used to alert the Shell Handler that a new module has been loaded.
 /// Used by the Shell Handler to determine when all modules have been loaded
 /// and the Login shell can be displayed.
 /// </summary>
 public override void FlagModuleAsLoaded()
 {
     ShellHandler.FlagModuleAsLoaded();
 }
Run Code Online (Sandbox Code Playgroud)