我的shell窗口中有一组选项卡,一个主要区域whicxh是一个contentcontrol。我还有四个模块,我想在选择某个选项卡时按需加载。因此,当选择tab1时,我想加载moduleA,当选择tab2时,我想加载ModuleB等。第一个模块在应用程序启动时加载。问题是当我改变标签时没有任何反应。没有错误很难。我正在使用这个版本的棱镜复合应用指南WPF和Silverlight - 2009年10月。
我试过这种方法:
外壳:
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;
}
}
我希望能够按需加载的模块B(我以前使用这条注释行,这就是我把它留在这里的原因):
[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 :(得分:3)
我成功使用按需加载模块。在我的场景中,我在用户登录后加载它们。
作为对项目的完整性检查,请确保您的ModuleB.dll与shell /应用程序位于同一目录中。 (例如,如果您处于调试模式,请确保将其复制到调试目录中)。
我有模块名称和模块名称相同,我不确定这是否是一个要求,但它是我坚持的惯例。
我的bootstrappers CreateModuleCatalog非常简单
protected override IModuleCatalog CreateModuleCatalog()
{
ModuleCatalog catalog = new ConfigurationModuleCatalog();
return catalog;
}
模块列在我的app.config文件
中<modules>
<module assemblyFile="PatronModule.dll" moduleType="PatronModule.PatronModuleDefinition, PatronModule" moduleName="PatronModule" startupLoaded="false" />
</modules>
然后当我加载模块时,我使用此代码
IModuleManager moduleManager = _container.Resolve<IModuleManager>();
ModulesConfigurationSection modules = ConfigurationManager.GetSection("modules") as ModulesConfigurationSection;
foreach (ModuleConfigurationElement module in modules.Modules)
moduleManager.LoadModule(module.ModuleName);
模块的加载必须在GUI线程上进行,因此如果需要,您需要使用调度程序进行加载(这是我用于它的行)
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() => { LoadModulesOnGuiThread(); }));
希望这会有所帮助
答案 1 :(得分:0)
我不太确定但在添加模块时尝试将InitializationMode设置为OnDemand,如下所示:
var catalog = new ModuleCatalog();
catalog.AddModule(typeof(ModuleA)).AddModule(typeof(ModuleB), InitializationMode.OnDemand);