C#:如何防止主窗体过早显示
在我的main方法中,我像往常一样启动main表单:C#:如何防止主窗体过早显示,c#,winforms,C#,Winforms,在我的main方法中,我像往常一样启动main表单: Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); 在主窗体加载中,我有以下内容,它将要求用户登录并加载 using (loginForm) { Di
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
在主窗体加载中,我有以下内容,它将要求用户登录并加载
using (loginForm)
{
DialogResult r = loginForm.ShowDialog();
switch (r)
{
case DialogResult.OK:
break;
default:
Application.Exit();
return;
}
}
我的问题是主窗体出现在后台,我希望它,嗯。。。不直到登录正常为止。我该怎么做?方法Application.Run()表示它自动显示表单。是否有其他方法可以启动主窗体而不显示它?或者我必须在主窗体的构造函数中将visible设置为false,然后在登录完成后返回true,或者类似的设置吗?这样做的推荐方式是什么?登录表单的意图类似于启动屏幕和登录的组合。因此,它首先加载并设置一些不同的东西,然后告诉用户登录 最简单的方法是使用Application.Run启动登录表单。当登录是确定的,其他东西已经设置好,只是显示'主'形式
Application.Run(new LoginForm());
并以“确定”按钮上的登录形式:
this.Visible = false;
this.ShowInTaskbar = false;
MainForm mainForm = new MainForm();
mainForm.Show();
而不是:
Application.Run(new MainForm());
尝试:
ShowDialog
方法是一个阻塞调用,程序将停止,直到对话框响应用户输入而关闭为止-通过按下“OK”按钮或“Cancel”按钮。在调用mainForm之前,是否有一点sleep
?还是onloadComplete?我喜欢Skizz答案,但如果这对您没有帮助,您也可以在MainForm的事件加载中这样做。只需将代码放在那里,即可显示登录对话框 显然,您需要添加凭证检查位,而不仅仅是发表评论(以防您不是在讽刺)。是的,这是我最初的想法,但我在某个地方读到,首先运行不同的表单可能会以某种方式导致问题?但是找不到它在哪里。。。不知道里面有多少。。。无论如何,你们可以在应用程序之前显示一个表单。Run被称为?@Filip那个是讽刺,还是你们说的那个评论是什么意思?我应该做点别的吗?或者是因为回答有问题?@Svish这很好。您是对的,在应用程序之前显示非模式窗口时会出现问题。已调用Run,但模式对话框可以,因为它们会创建自己的消息循环。啊哈,好的。我现在已经使用了这个解决方案,至少在我看来,它工作得很好。谢谢你的快速回答!在98%的情况下使用睡眠表示存在设计缺陷。@Spook我同意有一些情况下睡眠是一个糟糕的设计。但是,它在很多情况下都很有用。最常见的情况可能是在一个无限循环中,该循环不应该占用所有CPU,并且在一个X周期内只运行一次。其他用例用于轮询外部资源(有时这是唯一的可能性,幸运的是,在大多数情况下,您可以使用同步技术或异步IO在必要时启动线程池线程)。因此,您提到了剩余的2%:)Inifnite循环不占用CPU是使用低优先级线程的好地方(或仅限于CPU的单核)如果您想让某些东西在一段时间内运行一次,您可以始终使用系统计时器。在我看来,轮询外部资源是我可能使用睡眠方法的唯一情况。
LoginDialog // the class that handles login UI
login = new LoginDialog ();
if (login.ShowDialog () == DialogResult.OK)
{
// check credentials
// if credentials OK
Application.Run(new MainForm());
}