我应该为每个WPF窗口创建单独的引导程序吗?

我应该为每个WPF窗口创建单独的引导程序吗?,wpf,prism,bootstrapper,Wpf,Prism,Bootstrapper,我是WPF和Prism的新手。我想知道我是否应该为每个新窗口创建新的引导程序?例如,在“Window1”中,我从列表框中选择元素,然后单击按钮“ShowDetails”,在新窗口“Window2”中,我应该看到我选择的详细信息。我为它们提供了窗口和模块,但我想知道如何以及在何处为“Window2”注册模块“Module2” 我的引导程序的例子 class Bootstrapper : UnityBootstrapper { protected override DependencyObj

我是WPF和Prism的新手。我想知道我是否应该为每个新窗口创建新的引导程序?例如,在“Window1”中,我从列表框中选择元素,然后单击按钮“ShowDetails”,在新窗口“Window2”中,我应该看到我选择的详细信息。我为它们提供了窗口和模块,但我想知道如何以及在何处为“Window2”注册模块“Module2”

我的引导程序的例子

class Bootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        var mainWindow = new Window1();
        mainWindow.Show();
        return mainWindow;
    }

    protected override IModuleCatalog GetModuleCatalog()
    {
        var moduleCatalog = new ModuleCatalog();
        moduleCatalog.AddModule(typeof(Module1));

        return moduleCatalog;
    }
}

"App.xaml.cs"

public partial class App : Application
{
    public App()
    { 
        var bootstrapper = new Bootstrapper();
        bootstrapper.Run();
    }
}

引导程序通常在WPF应用程序的启动类中使用。通常这是标准模板中的App.xaml.cs文件,它是App.xaml文件的代码隐藏类。您可以重写启动时的方法,实例化引导程序并调用其run方法。您可以延迟引导程序的启动,直到覆盖OnStartup,而不是将其写入App.xaml.cs类的构造函数中。然后,您将使用Prism中的RegionManager并在XAML中定义区域。如果您有多个独立的窗口,这与Prism的预期使用方式略有不同。在Prism源代码中提供的Bootstrapper类的CreateShell方法中定义了MainWindow或Shell的概念。取而代之的是,有一个主窗口并定义区域,也许考虑创建一个机制来在对话框中显示附加窗口。可以将主窗口划分为多个区域,并通过RegionManager注入用户控件。这是通过RegionManager的激活方法完成的

启动阅读模式和实践指南,也许考虑看Mike Taulty的棱镜上的视频。第一个视频在这里:

视频系列中有许多视频(总共10个)将帮助您开始使用PRISM

下面显示了如何在XAML中定义区域的示例:

<ItemsControl Regions:RegionManager.RegionName="MainRegion" />

您必须定义多个实现IModule接口的模块,并将这些模块添加到您的ModuleCatalog中,就像您使用ModuleA所做的那样

bootstrapper是一个集所有功能于一体的单人秀。。。理论上,一个应用程序中应该只存在一个。其中有
moduleCatalog.AddModule(typeof(Module1)),模块2也应该有一行,但wpf如何知道模块2是为Window2注册的呢?在Window1中我有“Region1”,在Window2中有“Region2”。当我尝试在bootstrapper中注册Module2时,我出现了一个错误“区域管理器不包含Region2区域”。我可以建议您开始使用Caliburn.Micro吗?它比PRISM简单得多,注册的东西也少得多。-为了进一步帮助您,并且在我的PRISM知识允许的范围内,您应该向RegionManager注册您的Region2,这似乎相当全面
var viewA = new ViewA(); 
var regionA = (new RegionManager()).Regions["RegionA"]; 
regionA.Activate(viewA);