在 Prism 应用程序中使用多个 shells/windows
Using multiple shells/windows in a Prism application
我正在尝试创建一个可以使用多个 windows 的应用程序。对于初学者,我希望它有启动画面 window 和 "main window"。我看到了这篇文章:http://southworks.com/blog/2010/01/26/creating-a-multi-shell-application-in-prism-v2/ 但是它似乎不符合我的需要。作者同时创建了 2 windows,也从一开始就显示了这两个。我想要做的是创建这个启动画面 window(带有一些不错的加载指示器),只有当它的底层逻辑将完成它的任务时,我想显示另一个 window
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。
好的模式是在整个应用程序中坚持一个 window。我的建议是将启动画面创建为 UserControl,然后在可见性方面搞砸。
您的 MainView 可能如下所示
<Grid>
<ContentControl Content="{Binding CurrentViewModel}"/>
<userControl:SplashScreen/>
</Grid>
此时您的初始屏幕覆盖了视图,一旦加载了视图,您就可以使初始屏幕不可见。为此,请创建另一个 class,它将公开像 IsVisible 这样的布尔值 属性,以及用于分别使初始屏幕可见和不可见的方法 Show/Hide。
随后,您将 SplashScreen 的 DataContext 设置为 class,将 Visibility 属性 绑定到 IsVisible 并使用 WPF 默认提供的 BooleanToVisibilityConverter。为了外观,您可以将启动画面不透明度设置为,例如 0.75,这样它会通过启动画面显示同时显示一些目标视图。
每当您想显示启动画面时调用 Show 方法,在方法中将 IsVisible 设置为 true,引发 PropertyChanged 事件并在视图中反映更改。结果,Visibility 设置为 true,启动画面显示在顶部覆盖其他所有内容。
如果您按照这些步骤操作,您应该会获得类似的结果。显示的消息也可以明确调整,以替代硬编码的“Loading”。
为什么不在调用 MainWindow.Show 之前显示启动画面?只需将其显示为 ShowDialog 即可停止引导程序表单继续处理,直到您关闭初始屏幕。
protected override void InitializeShell()
{
var sc = new SplashScreen();
sc.ShowDialog();
App.Current.MainWindow = (Window)Shell;
App.Current.MainWindow.Show();
}
我正在尝试创建一个可以使用多个 windows 的应用程序。对于初学者,我希望它有启动画面 window 和 "main window"。我看到了这篇文章:http://southworks.com/blog/2010/01/26/creating-a-multi-shell-application-in-prism-v2/ 但是它似乎不符合我的需要。作者同时创建了 2 windows,也从一开始就显示了这两个。我想要做的是创建这个启动画面 window(带有一些不错的加载指示器),只有当它的底层逻辑将完成它的任务时,我想显示另一个 window
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。
好的模式是在整个应用程序中坚持一个 window。我的建议是将启动画面创建为 UserControl,然后在可见性方面搞砸。 您的 MainView 可能如下所示
<Grid>
<ContentControl Content="{Binding CurrentViewModel}"/>
<userControl:SplashScreen/>
</Grid>
此时您的初始屏幕覆盖了视图,一旦加载了视图,您就可以使初始屏幕不可见。为此,请创建另一个 class,它将公开像 IsVisible 这样的布尔值 属性,以及用于分别使初始屏幕可见和不可见的方法 Show/Hide。
随后,您将 SplashScreen 的 DataContext 设置为 class,将 Visibility 属性 绑定到 IsVisible 并使用 WPF 默认提供的 BooleanToVisibilityConverter。为了外观,您可以将启动画面不透明度设置为,例如 0.75,这样它会通过启动画面显示同时显示一些目标视图。
每当您想显示启动画面时调用 Show 方法,在方法中将 IsVisible 设置为 true,引发 PropertyChanged 事件并在视图中反映更改。结果,Visibility 设置为 true,启动画面显示在顶部覆盖其他所有内容。
如果您按照这些步骤操作,您应该会获得类似的结果。显示的消息也可以明确调整,以替代硬编码的“Loading”。
为什么不在调用 MainWindow.Show 之前显示启动画面?只需将其显示为 ShowDialog 即可停止引导程序表单继续处理,直到您关闭初始屏幕。
protected override void InitializeShell()
{
var sc = new SplashScreen();
sc.ShowDialog();
App.Current.MainWindow = (Window)Shell;
App.Current.MainWindow.Show();
}