我有一个登录表单: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中释放登录表单,但在我的情况下让它可用实际上是有道理的,因为我们允许用户再次以应用程序内的不同用户身份登录。
答案 0 :(得分:3)
尝试更改应用的ShutdownMode。
App.Current.MainWindow
关闭时关机默认值为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);