C# 显示棱镜模块内部的棱镜模块
我在PRISM中实现应用程序,它需要从dll文件动态导入模块。 我设法做到了——它们正在导入,但我无法显示它。 我决定创建一个特殊的模块来封装它——让我们称之为ModuleDock。 所以我们有类似的东西: Bootstrapper.cs: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
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-很好的回答。我会很高兴,如果你回答我没有评论,我会标记你的回答作为我的问题的解决方案。