无法按需初始化或加载棱镜模块

时间:2018-01-17 09:26:59

标签: c# wpf xaml mvvm prism

我希望我的模块按需加载,我有一个困惑,如果我们不打算初始化我们的模块然后加载我们可以编写代码来执行和加载模块的方式和位置。 作为参考,我试过我只在这里使用ShellViewModel代码。 请让我知道我还需要做什么来加载视图点播或如果你有任何好的演示参考请告诉我

 public class ShellViewModel
    {

        public ShellViewModel(IModuleEnumerator moduleEnumerator, IModuleLoader moduleLoader, IRegionManager regionManager)
        {
            this.Initialize(moduleEnumerator, moduleLoader, regionManager);
        }

        public ICommand LoadModuleA { get; set; }

        public ICommand LoadModuleB { get; set; }

        public IModuleLoader ModuleLoader { get; set; }

        public IModuleEnumerator ModuleEnumerator { get; set; }

        public IRegionManager RegionManager { get; set; }

        private void Initialize(IModuleEnumerator moduleEnumerator, IModuleLoader moduleLoader, IRegionManager regionManager)
        {
            // Initialize command properties
            this.LoadModuleA = new LoadModuleACommand(this);
            this.LoadModuleB = new LoadModuleBCommand(this);

            // Initialize module properties
            this.ModuleEnumerator = moduleEnumerator;
            this.ModuleLoader = moduleLoader;
            this.RegionManager = regionManager;
        }

    }
}

以下是bootstraper类

public class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            var shell = Container.Resolve<Shell>();
            var shellViewModel = Container.Resolve<ShellViewModel>();
            shell.DataContext = shellViewModel;
            shell.Show();
            return shell;
        }

        protected override IModuleEnumerator GetModuleEnumerator()
        {
            return new DirectoryLookupModuleEnumerator(@".\Modules");
        }
    }

请告诉我是否需要发布更多代码我无法知道如何在需要时加载模块以及实际代码需要写入的位置(即在哪个部分中)

1 个答案:

答案 0 :(得分:0)

您没有为按需模块使用目录模块目录。

要按需加载模块,您需要指定将它们加载到模块目录中,并将InitializationMode设置为OnDemand。执行此操作后,您需要在应用程序中编写请求加载模块的代码。

使用属性将模块指定为按需,如以下代码示例所示。

protected override void ConfigureModuleCatalog() { . . . Type moduleCType = typeof(ModuleC); this.ModuleCatalog.AddModule(new ModuleInfo() { ModuleName = moduleCType.Name, ModuleType = moduleCType.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); . . . }

在按需指定模块后,应用程序可以请求加载模块。想要启动加载的代码需要获取对引导程序向容器注册的IModuleManager服务的引用。

private void OnLoadModuleCClick(object sender, RoutedEventArgs e) { moduleManager.LoadModule("ModuleC"); }

您可以在文档中阅读所有相关内容:http://prismlibrary.github.io/docs/wpf/Modules.html