我的工作要求是首先显示一个启动画面,它从用户那里获取一些数据,验证他并启动另一个表单。 所以,我正在使用Application.Run启动启动屏幕,有一次,它已完成它,调用Application.Exit然后再次为新窗体调用Application.Run。但是,这并没有启动新形式。 我创建了一个新线程并将其ApartmentModel指定为STA以启动新表单。
我想了解为什么Application.Run在调用Application.Exit后无效?
示例代码:
Application.Run(SplashForm);
if (_authorizationSuccessful)
Application.Run(new Form2())
else
{
//just close
}
答案 0 :(得分:3)
这是相当令人费解的,但核心问题是它实际上并不是一个使应用程序保持活跃状态的Form。核心助手类是ApplicationContext,也作为Application.Run()的重载之一公开。当您使用其他重载Run()和Run(Form)时,Application类会创建一个ApplicationContext的隐藏实例。与所有Application属性和方法一样,这是全局的。
因此,当您调用Application.Exit()时,将ApplicationContext的全局实例标记为“不再处于活动状态”。这使 next 调用Run(Form)立即退出。
您可以使用自己的ApplicationContext实例来解决此问题。但是样板解决方案是在登录表单上使用ShowDialog()方法。也是返回“登录好,让我们继续”状态的好方法,DialogResult很有用。
答案 1 :(得分:0)
首先,您需要以此形式显示主表单(在您的情况下为第二表单),您需要调用启动画面(身份验证),直到隐藏主时间表。在Splash Screen中,您需要使用this.Close()而不是Application.Exit()。关闭启动画面后,您需要显示主窗体。
答案 2 :(得分: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()
时,整个应用程序将关闭,而不是特定的表单
答案 3 :(得分:0)
为什么不这样做,而不是将所有东西都撕下来,为什么不这样做呢?
var f1 = new Form1();
f1.Show();
Application.Run();
其中Form1
是启动画面。然后当它准备好显示主屏幕时,它可以这样做:
var f2 = new Form2();
f2.Show();
this.Close();
Form2
是主屏幕。 (单个)消息循环始终在运行。
答案 4 :(得分:0)
当您想要退出应用程序时,向主方法抛出异常,捕获异常并根据需要退出应用程序。
假设,
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.
}