gpt4 book ai didi

c# - 显示 Prism 模块内的 Prism 模块

转载 作者:行者123 更新时间:2023-11-30 20:51:52 26 4
gpt4 key购买 nike

我在 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;
}
}

外壳.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 中不显示它吗?

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

最佳答案

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

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

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

有关模块化的更多信息,您可以引用以下MSDN Prism 指南章节:

我希望这对你有帮助,问候。

关于c# - 显示 Prism 模块内的 Prism 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21338556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com