4

我的工作要求是首先显示一个启动屏幕,该屏幕从用户那里获取一些数据,对他进行身份验证并启动另一个表单。因此,我使用 Application.Run 启动初始屏幕,一旦完成,调用 Application.Exit 然后再次调用 Application.Run 以获取新表单。但是,这不会启动新表单。我创建了一个新线程并将其 ApartmentModel 分配为 STA 以启动新表单。

我想了解为什么 Application.Run 在调用 Application.Exit 后不起作用?

示例代码:

        Application.Run(SplashForm);  

        if (_authorizationSuccessful)
            Application.Run(new Form2())
        else
        {
            //just close
        }
4

5 回答 5

3

它相当令人费解,但核心问题是它实际上并不是让应用程序保持活动状态的表单。核心帮助类是 ApplicationContext,也作为 Application.Run() 的重载之一公开。当您使用其他重载 Run() 和 Run(Form) 时,Application 类会创建 ApplicationContext 的隐藏实例。它是全局的,就像所有的应用程序属性和方法一样。

因此,当您调用 Application.Exit() 时,会将 ApplicationContext 的全局实例标记为“不再活动”。这使得对 Run(Form) 的下一次调用立即退出。

您可以使用自己的 ApplicationContext 实例来解决这个问题。但样板解决方案是在登录表单上使用 ShowDialog() 方法。也是返回“登录成功,让我们继续”状态的好方法,DialogResult 很有用。

于 2012-10-12T23:55:44.203 回答
0

首先,您需要在此表单中显示主表单(在您的情况下为第二表单),您需要调用启动画面(身份验证),直到那时主表单将被隐藏。在启动画面中,您需要使用 this.Close() 而不是 Application.Exit()。关闭启动屏幕后,您需要显示主窗体。

于 2012-10-11T04:53:36.133 回答
0

这样做

new SplashScreenForm().ShowDialog();//show splash screen and take user input
new MainForm().Show();//now show the main form
Application.Run();//starts the app

或者

if (new SplashScreenForm().ShowDialog() == DialogResult.OK)//if its ok to start another form
{
    Application.Run(new MainForm());
}

笔记

Application.Run(Form) 在当前线程上启动一个消息循环并显示指定的表单。消息循环使表单能够接收 Windows 消息(例如,按键、鼠标单击、绘制失效),以使其显示为响应式并与用户进行交互

所以,当你Application.Exit()关闭整个应用程序时,而不是特定的形式

于 2012-10-11T06:42:13.020 回答
0

与其把所有东西都拆掉,只是为了重新建立起来,为什么不这样做:

var f1 = new Form1();
f1.Show();
Application.Run();

Form1闪屏在哪里。然后当它准备好显示主屏幕时,它可以这样做:

var f2 = new Form2();
f2.Show();
this.Close();

Form2主屏幕在哪里。(单个)消息循环始终保持运行。

于 2012-10-11T07:06:38.970 回答
0

当您想退出应用程序时,向 main 方法抛出异常,捕获异常并根据需要退出应用程序。

认为,

try
{
    // your code here
}
catch
{
    // Some exception occurred here, and you want to exit here...
    throw;
}

在主程序中捕获异常,主程序代码为:

try
{
    Application.Run(new Form1());// <-- This is where you want to run your app
}
catch // <-- Catch here the exception where you want to exit your app
{
    Application.Exit(); //<-- exit app here.
}
于 2013-10-07T09:14:21.933 回答