在Application_Startup中显示窗口。WPF

3
我有这段小代码。
private void Application_Startup(object sender, StartupEventArgs e)
        {
            WndAbout ab = new WndAbout();
            ab.Show();
        }

我希望在应用程序启动之前显示窗口或对话框,而其他模块将在此之后加载。

但是!当我关闭显示的窗口时,稍后启动的主窗口也关闭了!

我做错了什么?我尝试使用Showdialog(),但出现了相同的情况。

2个回答

6
你遇到的问题来自WPF管理关闭方式的方法。 你可以通过...更改关闭行为。
Application.Current.ShutdownMode

...属性。将其更改为适当的值:

Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnLastWindowClose;

这将有所帮助。

另一种方法是手动设置MainWindow属性为您的第二个窗口。

如果您只想制作一个启动屏幕,请使用自.net 3.51以来可用的启动屏幕选项。它的优点在于它在应用程序加载序列中非常早地加载,比窗口更早。

要做到这一点,请打开项目资源管理器中图像的属性选项卡,并将生成操作设置为SplashScreen


更新

在我的一个应用程序中,我有一个设计,在显示主窗口之前也必须显示一个模态对话框。当时我不知道ShutdownMode属性。

我的做法是首先启动对用户不可见的Window。这是第一个窗口,它还控制着应用程序的生命周期(WPF的默认行为)。然后从这个窗口中打开所需的对话框(一个显示模态的窗口)。如果此对话框未成功完成,则终止隐藏窗口,并完全关闭应用程序。如果对话框结果良好,则创建第一个MainWindow实例,用户可以使用。


不,两者都没有帮助。但是看起来,我已经排除了这种情况。我正在隐藏关于窗口,出于某种原因它有所帮助。 - Alex Blokha
我认为你需要删除StartupURI并手动打开窗体。然而,你所描述的也是一种可能的方式(我也用过类似的方法解决问题)。但这只是一个建议,如果你只想在应用程序启动时显示关于信息,请考虑使用闪屏选项。它会在应用程序启动之前显示,加载大型程序集之前,因此使用它可以为你的应用程序带来更好的用户体验。 - HCL
不好意思,关于对话框只是个例子,我误导了你。它应该是LogonDialog(登录对话框)。 - Alex Blokha
没有启动URI。 首先,我会显示模态LogonDialog,然后手动显示splashScreen。 我将在OnLoadCompleted中关闭它。然后我调用我的MainForm。但是我在这里发现另一个问题,如果我显示模态logonDialog,则不会出现OnLoadCompleted,并且我的splashscreen仍然停留在屏幕上。 但是我想在LogonDialog之后显示splashScreen... - Alex Blokha
我已经扩展了我的答案,并在解决方案中添加了一个隐藏窗口的段落。 - HCL

2
private void Application_Startup(object sender, StartupEventArgs e) 
{ 
  ShutdownMode mode = this.ShutdownMode;
  this.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
  YourLogonWnd logon = new YourLogonWnd();
  logon.ShowDialog();
  if (!logon.DialogResult.HasValue || !logon.DialogResult.Value)
    this.Shutdown();
  else
    this.ShutdownMode = mode;
}

实际上,在事件处理程序的末尾使用“OnMainWindowClose”更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接