0

我有一个带有两个模块的 Prism Shell。一个模块应该是主应用程序模拟,MainAppMock而另一个模块应该是主系统用作区域的任何模块,ModuleOne. 可能是一个,可能是一百万个模块。

问题在于了解 Prism 的工作原理。除非我在文件中调用它的MainAppModule命名空间,否则初始化正确。Bootstrapper MainWindow.xaml

我的问题:这是因为它在我调用该命名空间时在运行时加载模块,因此Prism因为它已经加载而没有加载它?幕后究竟发生了什么?

壳:

class Bootstrapper : NinjectBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        return Kernel.Get<MainWindow>();
    }

    protected override void InitializeShell()
    {
        Application.Current.MainWindow = (Window)Shell;
        Application.Current.MainWindow.Show();
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        return new DirectoryModuleCatalog
        {
            ModulePath = AppDomain.CurrentDomain.BaseDirectory
        };
    }
}

MainAppMock 和 ModuleOne 除了名称之外是相同的。

ModuleOne 类:

[Module(ModuleName = "ModuleOne.Module")]
public class Module : IModule
{
    private readonly IRegionManager _regionManager;
    private readonly IKernel _kernel;

    public Module(IRegionManager regionManager, IKernel kernel)
    {
        _regionManager = regionManager;
        _kernel = kernel;
    }

    public void Initialize()
    {
    }
}

问题就在这里。在Bootstrapper MainWindow

<Window x:Class="PrismTest.MainWindow"
    xmlns:mainAppMock="clr-namespace:MainAppMock;assembly=MainAppMock"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <mainAppMock:MainUserControl />
</Grid>

注意:如果我删除mainAppMock上面提到的命名空间,它工作正常。

4

2 回答 2

1

在与几个人讨论后,我们得出了一个结论。

我们MainAppMock通过namespace:MainUserControlShell MainWindow. 当 Prism 的引导程序运行时,它将进入AppDomain.CurrentDomain.BaseDirectoryDLL 并搜索从IModule. 它意识到这样MainAppMock做了,但它已经加载了。加载已经加载的 DLL 是没有意义的。因此,它不会重新加载它并且Module永远不会运行。

值得一提的是,MainAppMock初始化方法是在加载DLL时运行的。我们实际上可以在Module那里执行我们的 Prism 代码,但不建议这样做。

于 2016-04-01T01:44:08.427 回答
1

棱镜有ModulesShell。让我们假设这Shell是 TV-Set,因此Modules将是 TV-Set 中的频道。在方法开始时(您打开电视机)protected override IModuleCatalog CreateModuleCatalog(),您正在加载Modules(电视机加载您搜索的频道):

protected override IModuleCatalog CreateModuleCatalog()
{
   ModuleCatalog catalog = new ModuleCatalog();
   catalog.AddModule(typeof(ModuleZooModule));//Channel about Zoo
   catalog.AddModule(typeof(ModuleSportModule));//Channel about Sport
   catalog.AddModule(typeof(ModuleProgrammingModule));//Channel about Programming
   return catalog;
}

通常Shell应该是这样的:

<DockPanel >            
   <ContentControl Margin="5"
        prism:RegionManager.RegionName="{x:Static inf:RegionNames.ContentRegion}"
        prism:RegionManager.RegionManager="{Binding RegionManager}"/>
</DockPanel>

该行prism:RegionManager.RegionName="{x:Static inf:RegionNames.ContentRegion}"显示应该Prism在您的(电视机Module)中注入(频道的视频流)的位置。Shell

但在你的情况下没有资格使用这样的东西:

<Grid>
    <mainAppMock:MainUserControl />
</Grid>

因为Prism不知道Module(某些频道)可以在您的Shell(电视机)中显示的位置。

于 2016-03-28T06:00:05.707 回答