我正在PRISM中实现应用程序,它需要从dll文件动态导入模块。 我设法做到了 - 他们正在导入,但我无法显示它。 我决定创建一个特殊的模块来封装它 - 让我们称之为ModuleDock。 所以我们有类似的东西:
Bootstrapper.cs:
class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)Shell;
Application.Current.MainWindow.Show();
}
protected override IModuleCatalog CreateModuleCatalog()
{
var modules = new DirectoryModuleCatalog
{
LoadSubdirectories = true,
ModulePath = @"C:\Modules"
};
modules.AddModule(typeof(ModuleDockModule));
return modules;
}
}
Shell.xaml:
<ContentControl regions:RegionManager.RegionName="ModuleDockModule" />
ModuleDockModule.cs(在ModuleDock项目中):
public class ModuleDockModule : IModule
{
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _unityContainer;
public void Initialize()
{
RegisterIoc();
if (_regionManager.Regions.ContainsRegionWithName("ModuleDockModule"))
{
_regionManager.RegisterViewWithRegion("ModuleDockModule", typeof(ModuleDockView));
}
}
public ModuleDockModule(IRegionManager regionManager, IUnityContainer unityContainer, IRegionViewRegistry regionViewRegistry)
{
_regionManager = regionManager;
_unityContainer = unityContainer;
}
private void RegisterIoc()
{
_unityContainer.RegisterType<IModuleDockView, ModuleDockView>();
_unityContainer.RegisterType<IModuleDockViewModel, ModuleDockViewModel>();
}
}
最后在一个已加载的模块中:
[Module(ModuleName = "TestModule", OnDemand = false)]
public class TestModuleModule : IModule
{
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _unityContainer;
public void Initialize()
{
RegisterIoc();
if (_regionManager.Regions.ContainsRegionWithName("TestModule"))
{
_regionManager.RegisterViewWithRegion("TestModule", typeof(TestView));
}
}
public TestModuleModule(IRegionManager regionManager, IUnityContainer unityContainer)
{
_regionManager = regionManager;
_unityContainer = unityContainer;
}
private void RegisterIoc()
{
_unityContainer.RegisterType<ITestView, TestView>();
_unityContainer.RegisterType<ITestViewModel, TestViewModel>();
}
}
出于测试目的,我已经创建了XAML行:
<ContentControl regions:RegionManager.RegionName="TestModule" />
你能否告诉我,为什么该行在Shell.xaml中显示TestModule,但不在ModuleDockView.xaml中显示?
请注意,在最后阶段我必须使用我平台的其他用户提供的各种未知模块,因此我无法做出任何静态的事情(如模块名称或初始化)。 提前谢谢!
答案 0 :(得分:4)
根据您描述的代码, TestModule 模块与 ModuleDockModule 具有模块依赖关系,因为这定义了 TestModule的视图的区域然后会注册。
因此,您需要确保在 TestModule 之前初始化 ModuleDockModule 以及任何其他依赖它的模块。为此,您需要在 TestModuleModule 类上声明依赖项属性,在类定义的正上方,如下所示:
[Module(ModuleName = "TestModule", OnDemand = false)]
[ModuleDependency("ModuleDockModule")]
public class TestModuleModule : IModule
{ ...
有关Moduled的更多信息,请参阅以下 MSDN Prism Guide 章节:
我希望这有助于你,问候。