2011-09-29 10 views
6

मैं वर्तमान में एक ऐसे एप्लिकेशन पर काम कर रहा हूं जो विभिन्न मॉड्यूल में अपनी कार्यक्षमताओं को विभाजित करने के लिए PRISM 4 का उपयोग करता है।क्या सभी मॉड्यूल लोड होने के बाद केवल एक खोल दिखाना संभव है?

मैंने देखा कि मेरे अनुप्रयोग के शैल, जो अपने क्षेत्रों में मॉड्यूल के विचार रखता है, मॉड्यूल लोड होने से पहले लोड और प्रदर्शित होता है।

इसका मतलब है कि शैल पहले प्रदर्शित होता है, और बाद में काफी समय (लगभग आधे सेकेंड), मॉड्यूल लोड होते हैं और विचार शैल के क्षेत्रों में डाले जाते हैं। यह बल्कि कष्टप्रद है, क्योंकि उपयोगकर्ता को स्टार्ट-अप पर एक खाली खोल के साथ बधाई दी जाती है, जो बहुत ही पेशेवर नहीं है।

क्या सभी मॉड्यूल लोड होने पर पता लगाने का कोई तरीका है? बूटस्ट्रैपर में कोई भी तरीका मैं ओवरराइड कर सकता हूं?

यदि मैं कर सकता था, तो मैं सभी मॉड्यूल लोड होने तक शैल (या लोडिंग एडॉर्नर प्रदर्शित करना) को छिपाना चाहता हूं।

+2

मुझे नहीं लगता कि डब्ल्यू बीमार करो जो आपको चाहिए लेकिन क्या आपने स्पलैशस्क्रीन देखी है? – Paparazzi

+0

मुझे स्प्लैशस्क्रीन से अवगत नहीं था, मैं इसे देख लूंगा, धन्यवाद। मुझे यकीन नहीं है कि यह समस्या को हल करेगा हालांकि, मुझे अभी भी यह निर्धारित करने की आवश्यकता होगी कि मॉड्यूल लोड होने पर कब समाप्त हो गया है। –

उत्तर

3

मुझे अपेक्षाकृत सरल समाधान मिला।

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

मैं अपने ShellHandler में एक तरीका है जिसके झंडा करने के लिए मॉड्यूल के द्वारा इस्तेमाल किया जा सकता बनाया:

मेरा आवेदन एक वर्ग ShellHandler नामित है, जो एक सिंगलटन के रूप में bootstrapper में instanciated और एकता कंटेनर में पंजीकृत है स्वयं के रूप में भरी हुई:

:

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

अंत में, मेरी ModuleBase वर्ग है, जो सभी मॉड्यूल को लागू में, मैं एक सार विधि है जो प्रारंभ प्रक्रिया के दौरान कहा जाता है बनाया 0

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

प्रत्येक मॉड्यूल को अब अपने निर्माता के माध्यम से ShellHandler सिंगलटन के कहने का समाधान करता है:

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

और अंत में वे 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

आप अपने शैल दृश्य दिखा सकते हैं मॉड्यूल प्रारंभ करने के बाद:

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

protected override void InitializeModules() 
{ 
    base.InitializeModules(); 
    Application.Current.MainWindow.Show(); 
} 
संबंधित मुद्दे