2011-09-29 10 views
6

Obecnie pracuję nad aplikacją, która wykorzystuje PRISM 4 do dzielenia swoich funkcjonalności w różnych modułach.Czy można wyświetlić powłokę tylko po załadowaniu wszystkich modułów?

Zauważyłem, że skorupa mojej aplikacji, która przechowuje widoki modułów w jej regionach, jest ładowana i wyświetlana przed załadowaniem modułów.

Oznacza to, że skorupa jest wyświetlana jako pierwsza, a znaczna część czasu później (około pół sekundy), moduły są ładowane, a widoki wstawiane w regiony powłoki. Jest to dość denerwujące, ponieważ użytkownik jest witany z pustą powłoką przy starcie, co nie jest zbyt profesjonalne.

Czy istnieje sposób na wykrycie, kiedy wszystkie moduły zostały załadowane? Każda metoda, którą mogę przesłonić w bootstrapperie?

Gdybym mógł, chciałbym ukryć powłokę (lub wyświetlić adoratora ładowania), dopóki wszystkie moduły nie zostaną załadowane.

+2

Nie sądzę, że źle robię to, czego potrzebujesz, ale czy spoglądasz na SplashScreen? – Paparazzi

+0

Nie wiedziałem o SplashScreen, zaglądnę w to, dzięki. Nie jestem pewien, czy to rozwiąże problem, ponieważ nadal będę musiał określić, kiedy moduły zostały załadowane. –

Odpowiedz

3

Znalazłem stosunkowo proste rozwiązanie.

Moja aplikacja posiada klasę o nazwie ShellHandler, który jest instanciated w inicjującego i zarejestrowany w kontenerze Unity jako pojedyncza:

Container.RegisterType<IShellHandler, ShellHandler>(new ContainerControlledLifetimeManager()); 

utworzonego w moim ShellHandler metodę, która może być użyta przez moduły do ​​flaga same jak załadowany:

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

Wreszcie w mojej klasie ModuleBase, której wszystkie moduły wdrożenia, stworzyłem abstrakcyjną metodę, która jest wywoływana podczas inicjalizacji:

/// <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(); 

Każdy moduł teraz rozwiązuje wystąpienie Singleton ShellHandler przez ich konstruktora:

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

I wreszcie wdrożyć abstrakcyjnej metody z ModuleBase:

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

Można pokazać swój pogląd Shell po zainicjowaniu modułów:

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

protected override void InitializeModules() 
{ 
    base.InitializeModules(); 
    Application.Current.MainWindow.Show(); 
} 
Powiązane problemy