【问题标题】:Using multiple shells/windows in a Prism application在 Prism 应用程序中使用多个 shell/窗口
【发布时间】:2016-02-20 15:59:23
【问题描述】:

我正在尝试创建一个使用多个窗口的应用程序。对于初学者,我希望它有一个启动屏幕窗口和一个“主窗口”。我来了这篇文章: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。

【问题讨论】:

    标签: c# wpf prism


    【解决方案1】:

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

        protected override void InitializeShell()
        {
            var sc = new SplashScreen();
            sc.ShowDialog();
    
            App.Current.MainWindow = (Window)Shell;
            App.Current.MainWindow.Show();
        }
    

    【讨论】:

    • 我说SplashScreen 并不是指以这种方式命名的C# 类。我正在构建一个自定义屏幕,该屏幕将显示我的产品徽标,并在其下方显示进度条以及有关当前正在发生的事情的一些信息。所以我猜想创建和显示我的自定义 SplashScreen 窗口不会阻止引导程序继续处理?
    • 不管你给它起什么名字。那是一个 Window 类,它可以做任何你想做的事情。只需调用 ShowDialog,它就会暂停引导程序继续。所以这意味着当你的启动画面关闭时,引导程序将继续,你的 shell 将正常显示。
    • 不知道!谢谢!顺便提一句。我是你们 PS 课程的忠实粉丝。有没有计划在非标准场景中制作一些(用于棱镜)?
    • 我必须知道那些“非标准场景”是什么。我已经开始了许多其他常见场景的高级课程。
    • @BrianLagunas : 我们如何将 prism 模块显示为对话框,一旦对话框关闭,然后显示主 shell。
    【解决方案2】:

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

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

    此时,您的初始屏幕覆盖了视图,并且一旦加载了视图,您就会使 SplashScreen 不可见。为此,请创建另一个类,该类将公开诸如 IsVisible 之类的布尔属性,以及用于使初始屏幕分别可见和不可见的 Show/Hide 方法。

    随后,将 SplashScreen 的 DataContext 设置为该类,将 Visibility 属性绑定到IsVisible 并利用 WPF 默认提供的 BooleanToVisibilityConverter。为美观起见,您可以将闪屏不透明度设置为,例如 0.75,以便通过闪屏显示同时显示某些目标视图。

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2011-07-28
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      相关资源
      最近更新 更多