C# 注销并返回Prism应用程序中的登录屏幕

C# 注销并返回Prism应用程序中的登录屏幕,c#,.net,wpf,.net-core,prism,C#,.net,Wpf,.net Core,Prism,我在基于prism的WPF应用程序中有一个登录序列,它在显示主窗口之前显示登录屏幕。在我的Bootstrapper类中,InitializeShell方法如下所示 protected override void InitializeShell() { var logon = new LogOnView(); bool? res = logon.ShowDialog(); if (!res ?? true) {

我在基于prism的WPF应用程序中有一个登录序列,它在显示主窗口之前显示登录屏幕。在我的Bootstrapper类中,InitializeShell方法如下所示

    protected override void InitializeShell()
    {
        var logon = new LogOnView();
        bool? res = logon.ShowDialog();
        if (!res ?? true)
        {
            Application.Current.Shutdown(1);
        }
        else
        {
            Application.Current.MainWindow.Show();
        }
    }
这一切都如期进行,如果用户登录、使用应用程序并关闭应用程序,则一切正常

我现在想做的是允许用户注销,或者务实地强制注销

如果我在MainWindowViewModel中使用与上述类似的代码尝试关闭MainWindow并显示无法工作的LogOnView

这几乎让我觉得我需要某种窗口管理器来显示和隐藏2个屏幕,这2个屏幕在引导程序完成它的工作后被初始化,或者让引导程序响应来自主窗口的事件或其他东西

实现这一目标的最佳方式是什么

我几乎觉得我需要某种窗口管理器来显示和隐藏这两个屏幕

默认行为是显示一个shell,基本上所有的事情都发生在那里。如果需要多个“shell”(例如登录窗口和常规shell),则必须扩展代码。从
InitializeShell
调用的窗口管理器听起来不错

// in the bootstrapper    
protected override void InitializeShell()
{
    Container.Resolve<IWindowManager>().SwitchToLoginWindow();
}

// from the login window
private void OnCredentialsValidated()
{
    _windowManager.SwitchToShell();
}

// somewhere else
private void OnLogOut()
{
    _windowManager.SwitchToLoginWindow();
}
//在引导程序中
受保护的覆盖无效初始值设置Shell()
{
Container.Resolve().SwitchToLoginWindow();
}
//从登录窗口
私有无效OnCredentialsValidated()
{
_windowManager.switchtosell();
}
//其他地方
私有void OnLogOut()
{
_windowManager.SwitchToLoginWindow();
}

窗口管理器创建并保存登录窗口和shell,显示其中一个,隐藏另一个。我会尽量不破坏和重新创建shell,以避免混淆区域管理器之类的东西。

谢谢,我使用了这个和其他一些位的组合来获得我想要的效果