6

我的 C# 应用程序中有 3 个表单——Form1、Form2 和 Form3。目前,当我的应用程序启动时,它会加载 Form1。我希望在应用程序启动时打开所有三个表单。

我试过这样做 Program.cs

static void Main()
{     
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    Application.Run(new Form2());
}

但 Form2 仅在 Form1 关闭后显示。

应用程序启动后,如何使所有 3 个表单同时显示?

4

4 回答 4

20

通常,让您的应用程序执行默认操作以外的其他操作(打开表单,等待它关闭,然后退出)的正确方法是创建一个继承自ApplicationContext. 然后你将你的类的一个实例传递给该Application.Run方法。当应用程序应该关闭时,请ExitThread()从您的班级中调用。

在这种情况下,您可以在应用程序加载时创建三个表单的实例,并为它们的Closed事件注册一个处理程序。当每个表单关闭时,处理程序将检查是否还有其他表单仍然打开,如果没有则关闭应用程序。

MSDN上的示例做了两件事:

  1. 打开多个表单并在它们全部关闭时退出应用程序
  2. 关闭每个表单时保存表单的最后大小和位置。

一个更简单的示例,仅在关闭所有表单后关闭应用程序:

class MyApplicationContext : ApplicationContext {
    private void onFormClosed(object sender, EventArgs e) {
        if (Application.OpenForms.Count == 0) {
            ExitThread();
        }
    }

    public MyApplicationContext() {
        //If WinForms exposed a global event that fires whenever a new Form is created,
        //we could use that event to register for the form's `FormClosed` event.
        //Without such a global event, we have to register each Form when it is created
        //This means that any forms created outside of the ApplicationContext will not prevent the 
        //application close.

        var forms = new List<Form>() {
            new Form1(),
            new Form2(),
            new Form3()
        };
        foreach (var form in forms) {
            form.FormClosed += onFormClosed;
        }

        //to show all the forms on start
        //can be included in the previous foreach
        foreach (var form in forms) {
            form.Show();
        }

        //to show only the first form on start
        //forms[0].Show();
    }
}

然后,您的Program课程如下所示:

static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MyApplicationContext());
    }
}

应用程序关闭逻辑显然可以自定义 - 任何表单仍然打开,或者只有这三种类型中的一种,或者只有前三个实例(这需要持有对前三个实例的引用,可能在 a 中List<Form>)。

回复:每个表单创建的全局事件——看起来很有希望。

这里有一个类似的例子。

于 2012-11-15T21:26:00.697 回答
10

Form.Load从 的事件开始其他形式Form1

private void Form1_Load(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.Show();
}
于 2012-11-15T20:59:43.530 回答
-1

我通过稍微修改 Zev Spitz 的答案找到了我的解决方案。

注意:此版本仅启动表单列表中指定的第一个表单。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

class MyApplicationContext : ApplicationContext
{
    public List<Form> Forms = new List<Form>() {
        new Form1()
    };

    private List<Form> FormCollectionToList(FormCollection fc)
    {
        List<Form> ff = new List<Form>();
        foreach (Form f in fc)
        {
            ff.Add(f);
        }
        return ff;
    }

    private void onFormClosed(object sender, EventArgs e)
    {
        Forms = FormCollectionToList(Application.OpenForms);
        if (Forms.Count == 0)
        {
            ExitThread();
        }
        foreach (var form in Forms)
        {
            form.FormClosed -= onFormClosed;
            form.FormClosed += onFormClosed;
        }
    }

    public MyApplicationContext()
    {
        if (Forms.Count == 0)
        {
            Process.GetCurrentProcess().Kill();
        }
        Forms[0].FormClosed += onFormClosed;
        Forms[0].Show();
    }
}

这个版本启动了所有这些。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

class MyApplicationContext : ApplicationContext
{
    public List<Form> Forms = new List<Form>() {
        new Form1()
    };

    private List<Form> FormCollectionToList(FormCollection fc)
    {
        List<Form> ff = new List<Form>();
        foreach (Form f in fc)
        {
            ff.Add(f);
        }
        return ff;
    }

    private void onFormClosed(object sender, EventArgs e)
    {
        Forms = FormCollectionToList(Application.OpenForms);
        if (Forms.Count == 0)
        {
            ExitThread();
        }
        foreach (var form in Forms)
        {
            form.FormClosed -= onFormClosed;
            form.FormClosed += onFormClosed;
        }
    }

    public MyApplicationContext()
    {
        if (Forms.Count == 0)
        {
            Process.GetCurrentProcess().Kill();
        }
        foreach (var form in Forms)
        {
            form.FormClosed += onFormClosed;
            form.Show();
        }
    }
}
于 2014-08-12T20:18:31.013 回答
-1

您也可以使用 3 个选项卡和一个表单而不是 3 个表单

于 2012-11-15T21:08:52.257 回答