6

C#アプリケーションには、Form1、Form2、Form3の3つのフォームがあります。現在、アプリケーションを起動すると、Form1が読み込まれます。アプリケーションの起動時に3つのフォームすべてを開きたい。

私はこれをやってみました 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()、クラス内から呼び出します。

この場合、アプリケーションのロード時に3つのフォームのインスタンスを作成し、それらのClosedイベントのハンドラーを登録できます。各フォームを閉じると、ハンドラーはまだ開いている他のフォームがあるかどうかを確認し、ない場合はアプリケーションを閉じます。

MSDNの例では、次の2つのことを行っています。

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

アプリケーションを閉じるロジックは、明らかにカスタマイズできます。フォームはまだ開いているか、これら3つのタイプの1つだけ、または最初の3つのインスタンスのみです(最初の3つのインスタンスへの参照を保持する必要がありますList<Form>)。

Re:フォーム作成ごとのグローバルイベント-これは有望に見えます。

ここに同様の例があります。

于 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

また、3つのフォームの代わりに1つのフォームで3つのタブを使用できます

于 2012-11-15T21:08:52.257 に答える
-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 に答える