C# CM引导程序在根视图之前显示一个窗口

C# CM引导程序在根视图之前显示一个窗口,c#,wpf,caliburn.micro,C#,Wpf,Caliburn.micro,我有一个Caliburn.Micro引导程序,我在其中使用OnStartup()检查一个视图,并在以后调用DisplayRootViewFor。在某些情况下,我必须让用户在根视图启动之前做出重要决定或显示一些警告。我可以通过使用WindowManager.ShowDialog()来实现这一点 但问题是:当我在根视图之前没有显示窗口时,所有的工作都与预期的一样 当我在根视图之前显示窗口时,会调用DisplayRootViewFor(),但应用程序会立即终止 我想这是因为当我在获取根视图并关闭之前使

我有一个Caliburn.Micro引导程序,我在其中使用
OnStartup()
检查一个视图,并在以后调用
DisplayRootViewFor
。在某些情况下,我必须让用户在根视图启动之前做出重要决定或显示一些警告。我可以通过使用
WindowManager.ShowDialog()
来实现这一点

但问题是:当我在根视图之前没有显示窗口时,所有的工作都与预期的一样

当我在根视图之前显示窗口时,会调用
DisplayRootViewFor()
,但应用程序会立即终止

我想这是因为当我在获取根视图并关闭之前使用窗口管理器显示窗口时,它会使WPF应用程序认为其主窗口已关闭,并自动终止

那么,如何在根视图之前显示(模式)窗口


我发现一个可能的解决方案是:

Application.ShutdownMode
设置为
OnExplicitShutdown
。然后我必须跟踪何时真正关闭应用程序,就像关闭shell时,我必须调用
System.Windows.application.Current.Shutdown()显式


我很好奇是否还有其他方法,但我猜当模式窗口关闭一段时间后,WPF应用程序中的窗口数量会下降到0,无论是否不久后建立了新的主窗口,都会触发关闭。

您可以在关闭时将关闭放在shell视图上,因为shell视图是主窗口窗口,如果用户关闭,则表示他们要关闭exe

private void ShellView_OnClosed(object sender, EventArgs e)
    {
        Application.Current.Shutdown();
    }

在主ViewModel的OnInitialize()中显示该对话框如何?@HenkHolterman这是一个隐式调用的方法吗?是的,当您的VM从Screen派生时。这将订阅代码隐藏中的事件,不是Caliburn.Micro处理MVVM的方式。如果这是一个问题,您可以将其置于deactive protected override void OnDeactivate(bool close){if(close){Application.Current.Shutdown();}base.OnDeactivate(close);}