在Prism模块中显示Prism模块

时间:2014-01-24 17:17:36

标签: c# wpf xaml prism prism-4

我正在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中显示?

请注意,在最后阶段我必须使用我平台的其他用户提供的各种未知模块,因此我无法做出任何静态的事情(如模块名称或初始化)。 提前谢谢!

1 个答案:

答案 0 :(得分:4)

根据您描述的代码, TestModule 模块与 ModuleDockModule 具有模块依赖关系,因为这定义了 TestModule的视图的区域然后会注册。

因此,您需要确保在 TestModule 之前初始化 ModuleDockModule 以及任何其他依赖它的模块。为此,您需要在 TestModuleModule 类上声明依赖项属性,在类定义的正上方,如下所示:

[Module(ModuleName = "TestModule", OnDemand = false)]
[ModuleDependency("ModuleDockModule")]
public class TestModuleModule : IModule
{ ...

有关Moduled的更多信息,请参阅以下 MSDN Prism Guide 章节:

我希望这有助于你,问候。