I want to load modules when my app loads and have them put their views in a region (see also this MSDN article) in the Shell (the main view). I am currently loading a module on demand and it works just fine. (I load the module with a button that calls this.moduleManager.LoadModule("ModuleB");
where moduleManager
is defined as [Import(AllowRecomposition = false)] private IModuleManager moduleManager;
. This all comes from the ModularityWithMef.Desktop sample application.) Here's the relevant code:
Module
[ModuleExport(typeof(ModuleB), InitializationMode = InitializationMode.OnDemand)]
public class ModuleB : IModule
{
[Import(AllowRecomposition = false)] private IRegionManager _regionManager;
/// <summary>
/// Initializes a new instance of the <see cref="ModuleB"/> class.
/// </summary>
public ModuleB()
{
}
/// <summary>
/// Notifies the module that it has be initialized.
/// </summary>
public void Initialize()
{
_regionManager.AddToRegion("ContentRegion", new ModuleBView());
}
}
XAML region
<TabControl Regions:RegionManager.RegionName="ContentRegion" />
When I change to loading the module when available ([ModuleExport(typeof(ModuleB), InitializationMode = InitializationMode.WhenAvailable)]
), I get a ModuleInitializeException when the bootstrapper is creating the Shell saying "This RegionManager does not contain a Region with the name 'ContentRegion'." This tells me that there is a timing issue with the creation of the region in the Shell and the initialization of the module.
So here's my question: How do I register the module's view with the Shell's region upon discovery and without having to use OnDemand initialization and manually load the module?