表单开始最小化

时间:2012-08-08 11:44:55

标签: c# winforms visual-studio-2010 windowstate

我有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");
        }
    }

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

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

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

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

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

哪个没用。

5 个答案:

答案 0 :(得分:3)

我很确定你是在诊断这个错误。对话框没有最小化,它消失在另一个应用程序的窗口后面。通常是Visual Studio,每个人都可以最大化它,因此它非常适合覆盖其他窗口。最小化其他窗口以找回对话框。

这里出现的问题是,一瞬间,您的应用程序没有Windows可以关注的任何窗口。实际上两次,在启动画面和登录表单之间。再次登录表单和主表单之间。 Windows窗口管理器被迫找到另一个要关注的窗口,因为你没有任何候选者,它会选择另一个应用程序的窗口。

窗口管理器允许给应用程序时间来创建它的第一个窗口,这不可避免地需要时间。你的启动画面毫无疑问会弄乱那种逻辑。代码不容易修复发布,调用ShowDialog()后调用代码的标准技巧将无法正常工作,因为您的应用程序还没有引发消息循环。这本身就是一个问题。至少通过修复启动画面开始解决这个问题,.NET已经内置了对它们的坚实支持。回答is here

答案 1 :(得分:1)

    t.Start();
    InitializeComponent(); 
    PopulateServers();
    Form frmLogin1 = new frmAppLogin();
    this.Activate(); //This Line will Solve your problem
    t.Abort();

答案 2 :(得分:0)

我知道我回答得太晚了。我得到了同样的问题并阅读了这篇文章并试图找出解决方案。

我创建了一个Timer对象,并设置了Interval = 10并在Timer上启动了Form Load event。然后在计时器的Tick事件上打开对话框并停止计时器并显示login.showDialog()。这对我来说可以。请参阅下面的代码。

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

答案 3 :(得分:0)

对于那些会遇到问题的人,会弹出一段时间,但会立即最小化到任务栏,这是一个可能的解决方案:

FormNew f = new FormNew();
f.Owner = this; // - this is the solution line
f.Show();

答案 4 :(得分: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
}

完成!