1

我有 3 个表单 - 主要表单是 Form1,其他表单是启动表单,然后是登录屏幕。启动画面首先显示并填充服务器。然后显示frmAppLogin,用户输入硬编码密码,结果返回form1。

public Form1()
    {
        _assembly = Assembly.GetExecutingAssembly();

        Stream icon = _assembly.GetManifestResourceStream.....

        this.Icon = new Icon(icon);

        Thread t = new Thread(new ThreadStart(SplashScreen));
        t.Start();
        InitializeComponent();
        PopulateServers();
        //Thread.Sleep(800);
        Form frmLogin1 = new frmAppLogin();
        t.Abort();

        frmLogin1.ShowDialog();


        DialogResult res = new DialogResult();
        res = frmLogin1.DialogResult;
        if (res == DialogResult.OK)
        {
            _LoggedIn = true;
        }

        else
        {
            _LoggedIn = false;
        }
 }

这是 form1_load 的代码:

private void Form1_Load(object sender, EventArgs e)
    {
        if (_LoggedIn)
        {
            try
            {
                blah blah........
            }
            catch
            {
                MessageBox.Show("Error accessing resources!");
            }
        }
        else
        {
            this.Close();
        }
    }

以及登录表单的代码:

public frmAppLogin()
    {
        InitializeComponent();
        this.WindowState = FormWindowState.Normal;
    }


    private void btnAppLogin_Click(object sender, EventArgs e)
    {
        if (txtAppPass.Text.ToString() == requiredPass)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        else
        {
            txtAppPass.Clear();
            txtAppPass.Focus();
            MessageBox.Show("Incorrect Password");
        }
    }

问题是当启动画面消失时,登录表单会在瞬间弹出,但会立即最小化到任务栏。

Startposition 通过 GUI 设置为 CenterScreen 和 WindowState Normal。

此外,这只发生在我在调试文件夹中运行 application.exe(或从中复制它)时,即当我在 Visual Studio 2010 中调试时不会发生这种情况。

编辑:只是为了添加这个,我也尝试过:

   private void frmAppLogin_Load(object sender, EventArgs e)
    {
        this.WindowState = FormWindowState.Normal;
    }

这没有帮助。

4

5 回答 5

4

我很确定你的诊断是错误的。该对话框不会最小化,它会消失在另一个应用程序的窗口后面。通常是 Visual Studio,每个人都将它最大化,因此它非常擅长覆盖其他窗口。最小化其他窗口以找到对话框。

这里的问题在于,在瞬间,您的应用程序没有任何 Windows 可以关注的窗口。实际上两次,在初始屏幕和登录表单之间。再次在登录表单和您的主表单之间。Windows 窗口管理器被迫寻找另一个窗口来聚焦,并且由于您没有任何候选者,它会选择另一个应用程序的窗口。

窗口管理器允许给应用程序时间来创建它的第一个窗口,这不可避免地需要时间。毫无疑问,您的启动画面会破坏该逻辑。发布的代码不容易修复,调用 ShowDialog() 后调用代码的标准技巧将不起作用,因为您的应用程序尚未发送消息循环。这本身就是一个问题。至少通过修复启动屏幕来解决这个问题,.NET 已经内置了对它们的可靠支持。答案在这里

于 2012-08-08T12:13:58.413 回答
1
    t.Start();
    InitializeComponent(); 
    PopulateServers();
    Form frmLogin1 = new frmAppLogin();
    this.Activate(); //This Line will Solve your problem
    t.Abort();
于 2019-04-11T21:29:11.863 回答
0

I know I am answering too late. I got the same issue and read this post and tried to figure out solution.

I have created a Timer object and set its Interval = 10 and started the Timer on the Form Load event. Then opened the dialog box on timer's Tick event and stopped the timer and shown the login.showDialog(). It works fine for me. See the code below.

        private Timer dispatcher;

        public MainView()
        {
            InitializeComponent();
            frmMdiChildList = new List<Form>();
            Load += new EventHandler(MainView_Load);
            FormClosing += new FormClosingEventHandler(MainView_FormClosing);
            Activated += new EventHandler(MainView_Activated);

        }

        void MainView_Load(object sender, EventArgs e)
        {
            dispatcher = new Timer();
            dispatcher.Interval = 10; //10 milliseconds
            dispatcher.Tick += new EventHandler(dispatcher_Tick);
            dispatcher.Start();
        }

        void dispatcher_Tick(object sender, EventArgs e)
        {
            dispatcher.Stop();
            dispatcher = null;
            showLoginForm();
        }

        private void showLoginForm() {
            Form loginForm = new LoginView();
            loginForm.ShowDialog();
        }
于 2013-12-20T12:32:50.583 回答
0

对于那些会在几秒钟内弹出表单但立即最小化到任务栏的问题,这是一个可能的解决方案:

FormNew f = new FormNew();
f.Owner = this; // - this is the solution line
f.Show();
于 2013-12-24T16:37:52.413 回答
0

我正在研究的程序也有同样的问题。这是我为解决它所做的。似乎运作良好。

在我的主要形式中,我设置了构造函数和StartForm方法,如下所示:

public FrmMain()
{
    Thread thread = new Thread(new ThreadStart(StartForm));
    thread.Start();
    Thread.Sleep(7000);
    InitializeComponent();
    thread.Abort();
}

private void StartForm()
{
    Application.Run(new FrmSplash());
}

然后在我的主要形式中,我将FrmMain_Load事件设置如下:

private void FrmMain_Load(object sender, EventArgs e)
{
    Activate(); // Give focus to FrmMain and maximize window
}

完毕!

于 2019-11-13T16:11:16.980 回答