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

3
我刚刚开始使用Caliburn Micro框架实现我的WPF应用程序(这是我第一次使用它)。
我已经配置了AppBootstrapper类,一切都正常(我的主窗口显示出来了),但现在我想要实现更复杂的应用程序行为。一开始,我只想显示一个“启动屏幕”(它将从服务中加载一些数据)。之后,我想只显示一个“登录”窗口,如果用户登录到系统中,我的“主”窗口就会显示出来。
换句话说,我想实现这样的窗口流程:
启动屏幕->登录窗口->主窗口
我尝试实现类似于“ShellController”的东西,它将从“Conductor .Collection.OneActive”或“Conductor ”派生,但我不知道如何在没有Shell视图的情况下完成它(它应该只是整个应用程序的控制器)。
我的另一个想法是在AppBootstrapper中重写DisplayRootView方法,在那里使用IWindowManager来显示窗口。这是一个好方法吗?
我非常感谢任何帮助或建议。
5个回答

8

可以重写DisplayRootView并使用IWindowManager来显示不同的屏幕/视图模型。

像这样:

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

好的,这是我尝试过的一种方法。谢谢你提供的代码。 - Rafal Spacjer

7

在Caliburn Micro v1.1中,DisplayRootViewFor()方法已经更改为静态方法。现在推荐的方法是在您的启动引导程序中重写OnStartup()方法以显示所需的闪屏或登录屏幕。


6
为了避免在调用LoginViewModel中的TryClose()后应用程序退出,请尝试按照以下步骤操作: 在您的App.xaml文件中,设置ShutdownMode="OnExplicitShutdown" 并在DisplayRootView结束时调用Application.Shutdown();

3

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


1
感谢您的回答和确认我的想法。顺便说一下,您的框架非常棒,感谢您的努力。 - Rafal Spacjer

0

我正在尝试完成与原帖相同的工作流程,但是当我在LoginViewModel上调用TryClose来关闭对话框时,似乎会导致应用程序退出,即使它刚打开Shell。

关闭LoginDialog的适当方法是什么,以允许应用程序按预期继续运行?


最好在这个问题上提出一个新的问题。 - biju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接