在Prism应用程序中使用多个shell /窗口

时间:2015-11-18 18:57:33

标签: c# wpf prism

我正在尝试创建一个使用多个窗口的应用程序。对于初学者,我希望它有一个闪屏窗口和一个“主窗口”。我发现这篇文章:http://southworks.com/blog/2010/01/26/creating-a-multi-shell-application-in-prism-v2/但它似乎并不适合我的需要。作者正在同时创建2个窗口,从一开始就显示两个窗口。我想要做的是创建这个启动画面窗口(带有一些不错的加载指示符),只有当它的底层逻辑完成其任务时,我才想显示另一个窗口

protected override DependencyObject CreateShell() {
    //return Container.Resolve<MainShell>();
    return Container.Resolve<SplashScreenShell>();
}

protected override void InitializeShell() {
    base.InitializeShell();

    App.Current.MainWindow = (Window)Shell;
    App.Current.MainWindow.Show();
}

另一个问题是,当我使用这个代码时,我的所有模块(即使是那些仅由MainShell使用的模块)也会被加载和初始化,而这完全不是我想要的。主要是因为Prism寻找SplashScreenShell上不存在的RegionName(但是存在于第二个shell上)。

我正在使用Prism 6.1.0和.NET 4.6。

2 个答案:

答案 0 :(得分:1)

好的模式是坚持整个应用程序的一个窗口。我的建议是创建启动画面作为UserControl然后搞乱可见性。 您的MainView可能如下所示

<Grid>
    <ContentControl Content="{Binding CurrentViewModel}"/>
    <userControl:SplashScreen/>
</Grid>

此时,您的启动画面会显示视图,一旦加载了视图,您就会使SplashScreen不可见。为了做到这一点,创建另一个类,它将公开布尔属性,如IsVisible,以及方法显示/隐藏,分别使得初始屏幕可见和不可见。

随后,您将SplashScreen的DataContext设置为该类,绑定可见性属性为IsVisible并使用默认情况下由WPF提供的 BooleanToVisibilityConverter 。为了外观,您可以将splash sreen opacity设置为0.75,以便通过启动屏幕同时显示一些目标视图。

每当您想要显示启动画面时,您调用Show方法,在方法中将IsVisible设置为true,引发 PropertyChanged 事件并在视图中反映更改。因此,Visibility设置为true,Splash屏幕显示在顶部,覆盖其他所有内容。

如果您遵循这些步骤,您应该获得类似的结果。显示的消息也可以显式调整,作为硬编码“ Loading ”的替代。

enter image description here

答案 1 :(得分:1)

为什么不在调用MainWindow.Show之前显示启动画面?只需将其显示为ShowDialog即可停止引导程序表单继续处理,直到您关闭启动画面。

    protected override void InitializeShell()
    {
        var sc = new SplashScreen();
        sc.ShowDialog();

        App.Current.MainWindow = (Window)Shell;
        App.Current.MainWindow.Show();
    }