【问题标题】:Showing Prism modules inside Prism Module在 Prism Module 中显示 Prism 模块
【发布时间】:2014-01-24 17:17:35
【问题描述】:

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

请注意,在最后阶段,我必须使用我平台的其他用户提供的各种数量的未知模块,所以我不能将任何东西设为静态(如模块名称或初始化)。 提前谢谢!

【问题讨论】:

  • 为了确认,你是问为什么在ModuleDockView中不显示TestModule,而是在Shell中?这将取决于您在哪个 Xaml 页面中使用内容控件定义该区域。关于静态初始化,它们将在每个模块内进行。因此,您无需担心这一点。我会考虑在每个人都知道的枚举类中定义默认的 RegionNames。
  • @GOstrowsky - 没有。 TestModule 没有显示在 ModuleDockView 中 - 但我知道加载它时一切都是正确的,因为如果我将相同的区域放在 Shell.xaml 中并将其从 ModuleDockView.xaml 中删除(用于测试目的)它正在显示。从另一面 - 我使用带有静态字符串的类作为区域名称,但对于堆栈,我使用文本值作为示例以提高可读性。
  • 感谢您的解释。问题在于模块的加载顺序,因为 TestModule 依赖于 ModuleDockModuleModuleDockModule 区域。您能否检查 TestModule 是否在 ModuleDockModule 之前初始化?如果是这样,那么您需要在 TestModuleModule 类中添加一个依赖属性作为 [ModuleDependency("ModuleDockModule")],在模块名称下方属性。问候。
  • @GOstrowsky - 很好的答案。如果您回答我(不发表评论),我会很高兴,我会将您的回答标记为我的问题的解决方案。

标签: c# wpf xaml prism prism-4


【解决方案1】:

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

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

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

有关 Moduled 的更多信息,您可以参考以下 MSDN Prism 指南章节:

希望这对您有所帮助,问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多