Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:如何防止主窗体过早显示_C#_Winforms - Fatal编程技术网

C#:如何防止主窗体过早显示

C#:如何防止主窗体过早显示,c#,winforms,C#,Winforms,在我的main方法中,我像往常一样启动main表单: Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); 在主窗体加载中,我有以下内容,它将要求用户登录并加载 using (loginForm) { Di

在我的main方法中,我像往常一样启动main表单:

        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());
}