Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Prism应用程序中使用多个外壳/窗口_C#_Wpf_Prism - Fatal编程技术网

C# 在Prism应用程序中使用多个外壳/窗口

C# 在Prism应用程序中使用多个外壳/窗口,c#,wpf,prism,C#,Wpf,Prism,我正在尝试创建一个使用多个窗口的应用程序。首先,我希望它有一个闪屏窗口和一个“主窗口”。我带来了这篇文章:但是它似乎不适合我的需要。作者同时创建了两个窗口,并且从一开始就显示了这两个窗口。我想做的是创建这个闪屏窗口(带有一些漂亮的加载指示器),只有当它的底层逻辑完成任务时,我才想显示另一个窗口 protected override DependencyObject CreateShell() { //return Container.Resolve<MainShell>();

我正在尝试创建一个使用多个窗口的应用程序。首先,我希望它有一个闪屏窗口和一个“主窗口”。我带来了这篇文章:但是它似乎不适合我的需要。作者同时创建了两个窗口,并且从一开始就显示了这两个窗口。我想做的是创建这个闪屏窗口(带有一些漂亮的加载指示器),只有当它的底层逻辑完成任务时,我才想显示另一个窗口

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();
}
protected override DependencyObject CreateShell()受保护的覆盖依赖对象{
//返回Container.Resolve();
返回Container.Resolve();
}
受保护的覆盖无效初始值设置Shell(){
base.InitializeShell();
App.Current.MainWindow=(窗口)Shell;
App.Current.MainWindow.Show();
}
另一个问题是,当我使用这段代码时,我的所有模块(甚至那些仅由MainShell使用的模块)都会被加载和初始化,这完全不是我想要的。主要是因为Prism查找的RegionName不在SplashScreenShell上(但在第二个shell上)


我使用的是Prism 6.1.0和.NET 4.6。

最好是在整个应用程序中只使用一个窗口。我的建议是创建一个初始屏幕作为用户控件,然后在可见性方面搞得一团糟。 您的主视图可能如下所示

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

此时,您的闪屏将覆盖视图,一旦加载视图,您将使闪屏不可见。为此,创建另一个类,该类将公开布尔属性,如IsVisible,并使用Show/Hide方法分别使启动屏幕可见和不可见。

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

每当您想要显示初始屏幕时,您都会调用show方法,在您将IsVisible设置为true的方法中,将引发PropertyChanged事件,并在视图中反映更改。因此,可见性被设置为true,启动屏幕显示在顶部,覆盖所有其他内容。

如果你遵循这些步骤,你会得到类似的结果。显示的消息也可以明确调整,以代替硬编码的“加载”


为什么不在调用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窗口不会阻止引导程序继续处理?不管你怎么称呼它。这是一个窗口类,它可以做任何你想做的事情。只需调用ShowDialog,它将暂停引导程序继续。所以这意味着当你的启动屏幕关闭时,引导程序将继续,你的外壳将正常显示。我不知道!谢谢顺便说一句,我非常喜欢你的PS课程。有没有计划在非标准场景中制作一些(针对prism的)场景?我必须知道那些“非标准场景”是什么。我已经开始了许多其他常见场景的高级课程。@BrianLagunas:如何将棱柱模块显示为对话框,一旦关闭此对话框,则显示主shell。