Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示棱镜模块内部的棱镜模块_C#_Wpf_Xaml_Prism_Prism 4 - Fatal编程技术网

C# 显示棱镜模块内部的棱镜模块

C# 显示棱镜模块内部的棱镜模块,c#,wpf,xaml,prism,prism-4,C#,Wpf,Xaml,Prism,Prism 4,我在PRISM中实现应用程序,它需要从dll文件动态导入模块。 我设法做到了——它们正在导入,但我无法显示它。 我决定创建一个特殊的模块来封装它——让我们称之为ModuleDock。 所以我们有类似的东西: Bootstrapper.cs: class Bootstrapper : UnityBootstrapper { protected override DependencyObject CreateShell() { return Container.Res

我在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" />
ModuleDock项目中的ModuleDockModule.cs:

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视图随后将注册到的区域

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

[Module(ModuleName = "TestModule", OnDemand = false)]
[ModuleDependency("ModuleDockModule")]
public class TestModuleModule : IModule
{ ...
有关Moduled的更多信息,请参阅以下MSDN Prism指南章节:


我希望这对您有所帮助。

基于您描述的代码,TestModule模块与ModuleDockModule具有模块依赖关系,因为这定义了TestModule视图随后将注册到的区域

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

[Module(ModuleName = "TestModule", OnDemand = false)]
[ModuleDependency("ModuleDockModule")]
public class TestModuleModule : IModule
{ ...
有关Moduled的更多信息,请参阅以下MSDN Prism指南章节:


我希望这对您有所帮助。

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