我刚开始使用Caliburn Micro框架实现我的WPF应用程序(这是我第一次使用它)。
我已经配置了AppBootstrapper
类,一切正常(我的主窗口显示),但现在我想实现我的应用程序更复杂的行为。一开始我想只显示启动画面(它会从服务中加载一些数据)。在它之后,我只想显示 LogIn 窗口,如果用户登录系统,我的 Main 窗口应显示。
用另一个词说话我想实现那种窗口流程:
启动画面 - >登录窗口 - >主窗口
我尝试实现ShellController
或Conductor<IScreen>.Collection.OneActive
派生的Conductor<IScreen>
之类的内容,但如果没有View for the Shell我就不知道怎么做(它应该只是整个应用程序的控制器。)
我的另一个想法是在AppBootstrapper中覆盖DisplayRootView
方法,并使用IWindowManager
来显示窗口。这是好方法吗?
如果有任何帮助或建议,我将非常感激。
答案 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的适当方法是什么,允许应用程序按需继续?