为什么Caliburn Micro会在初始登录关闭时关闭所有屏幕?

时间:2015-04-20 15:53:34

标签: wpf caliburn.micro

我有一个登录表单:LoginView.xaml和LoginViewModel.cs,它们继承自Window。登录成功后,我将使用TryClose()关闭表单。

我的AppBoostrapper.cs类执行以下操作:

var shell = IoC.Get<IShell>();
windowManager.ShowDialog(shell);

(我也试过使用DisplayRootViewFor(),但应用程序只是启动和退出 - 显然没有进入表单事件循环)。

我的ShellViewModel如下所示:

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShell 
    public ShellViewModel()
    {
        var login = IoC.Get<Login.LoginViewModel>();
        login.UserName = login.App.Get(RegKeyName.LastUser);
        login.AppVersion = login.App.AppVersion;
        var windowManager = IoC.Get<IWindowManager>();
        windowManager.ShowDialog(login);

        //ActivateItem(login);
    }
}

因此,当shell启动时,它会显示登录屏幕。但是,一旦登录屏幕关闭,shell也会关闭。我可以通过使我的登录屏幕成为UserControl并调用ActivateItem(然后当UserControl关闭shell保持运行时)来解决这个问题,但我真的希望登录是一个真正的Window并且不包含在初始shell中。

如何在“登录”屏幕关闭后保持我的Shell运行事件?

编辑:这是我为了让它发挥作用所做的改变

在我的登录屏幕中,我使用的是TryClose()。实际上,隐藏屏幕更有意义,因此AppBootstrapper可以通过我的LoginViewModel属性确定登录是否成功(并继续或退出应用程序)。所以我改为将TryClose()更改为Hide:

 (GetView() as Window).Hide();

然后我将以前在ShellViewModel构造函数中的代码移回AppBootstrapper。所以现在我的OnStartup看起来像这样:

_windowManager = IoC.Get<IWindowManager>();
if (Login(_windowManager))
{
    StartApp(_windowManager);
}

Application.Shutdown();

我在AppBootstrapper中的Login方法如下所示:

protected bool登录(IWindowManager windowManager) {     var login = IoC.Get();     windowManager.ShowDialog(登录);     return login.IsAuthenticated; }

似乎我应该在某些时候从windowManager中释放登录表单,但在我的情况下让它可用实际上是有道理的,因为我们允许用户再次以应用程序内的不同用户身份登录。

2 个答案:

答案 0 :(得分:3)

尝试更改应用的ShutdownMode

  • OnLastWindowClose - 关闭所有Window对象时关闭
  • OnMainWindowClose - App.Current.MainWindow关闭时关机
  • OnExplicitShutdown - 仅在告知应用程序关闭时关闭

默认值为OnLastWindowClose,因此如果您在打开新窗口之前关闭最后一个窗口,应用程序将会关闭。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        this.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
    }
}

答案 1 :(得分:1)

将登录窗口的所有者设置为null。

dynamic settings = new ExpandoObject();
settings.Owner = null;

然后:

windowManager.ShowDialog(login, null, settings);
相关问题