如何使用Caliburn Micro控制WPF应用程序中的窗口流量

时间:2011-04-27 10:50:26

标签: wpf mvvm caliburn.micro

我刚开始使用Caliburn Micro框架实现我的WPF应用程序(这是我第一次使用它)。

我已经配置了AppBootstrapper类,一切正常(我的主窗口显示),但现在我想实现我的应用程序更复杂的行为。一开始我想只显示启动画面(它会从服务中加载一些数据)。在它之后,我只想显示 LogIn 窗口,如果用户登录系统,我的 Main 窗口应显示。

用另一个词说话我想实现那种窗口流程:

启动画面 - >登录窗口 - >主窗口

我尝试实现ShellControllerConductor<IScreen>.Collection.OneActive派生的Conductor<IScreen>之类的内容,但如果没有View for the Shell我就不知道怎么做(它应该只是整个应用程序的控制器。)

我的另一个想法是在AppBootstrapper中覆盖DisplayRootView方法,并使用IWindowManager来显示窗口。这是好方法吗?

如果有任何帮助或建议,我将非常感激。

5 个答案:

答案 0 :(得分:8)

是覆盖DisplayRootView并使用IWindowManager显示不同的屏幕/视图模型。

这样的事情:

var windowManager = IoC.Get<IWindowManager>();
windowManger.ShowDialog(IoC.Get<SplashScreenViewModel>());
if(windowManger.ShowDialog(IoC.Get<LoginViewModel>()))
{
   windowManger.ShowWindow(IoC.Get<ShellViewModel>());
}

答案 1 :(得分:7)

在Caliburn Micro v1.1中,DisplayRootViewFor()方法已更改为静态。现在推荐的方法是覆盖Bootstrapper中的OnStartup()方法,以显示所需的启动或登录屏幕。

答案 2 :(得分:6)

要在LoginViewModel上调用TryClose()后避免应用程序退出,请尝试以下操作: 在App.xaml中,设置ShutdownMode="OnExplicitShutdown" 并在DisplayRootView的末尾调用Application.Shutdown();

答案 3 :(得分:3)

是的,您对DisplayRootView的想法是正确的。我建议您覆盖该方法并在那里实现自定义行为。您可以直接使用IWindowManager来显示窗口。如果您的逻辑很重要,您当然可能希望将其抽象为一个可以协调启动事件的简单控制器。

答案 4 :(得分:0)

我正在尝试完成与原始海报相同的工作流程,但是,当我在LoginViewModel上调用TryClose时,要关闭对话框,这似乎会导致应用程序退出,一打开就关闭Shell。

关闭LoginDialog的适当方法是什么,允许应用程序按需继续?