2017-03-16 5 views
0

私は複数のフォームを一度に開くC#アプリケーションを作成しています。これは現在、まずフォームをすべて開いてからコンテンツを読み込んで動作します。フォームを強制的に開き、内容をロードしてから、次のフォームを開きますか?別のものを開く前にフォームの読み込みを行うには?

繰り返しアクションは、複数のフォームを一度に開くトリガーです。

static void Main(string[] args) 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    ShowForms(); 
    Application.Run(); 
} 
static void ShowForms() 
{ 
    Random random = new Random(); 
    int formCount = 0; 

    RepeatAction(5,() => 
    { 
     formCount++; 

     int x = random.Next(0, 1000); 
     int y = random.Next(0, 1000); 

     Form1 form = new Form1 
     { 
      StartPosition = FormStartPosition.Manual, 
      ShowInTaskbar = false, 
      Location = new Point(x, y) 
     }; 

     form.FormClosed += (sender, e) => 
     { 
      if (--formCount > 0) 
      { 
       return; 
      } 

      Application.ExitThread(); 
     }; 

     form.Show(); 
    }); 
} 
+0

Winformsには「コンテンツを読み込む」アクションはありません。これはフォームオブジェクトを構築するときに実行され、そのInitializeComponent()メソッドはコンストラクタによって呼び出されます。ほとんどのプログラマは、完全にペイントされたものと混同しています。これは、コントロールやビットマップでいっぱいになったフォームでしばらく時間がかかります。表示されたイベントはそのために使用可能で、Update()を呼び出してコントロールがペイントされていることを確認します。 –

答えて

0

form.Show();は、フォームを表示します。したがって、RepeatActionを順次ループにするか、フォームの配列を保持してから、配列全体を反復してform.show()関数を呼び出します。

0

単純なループではなく、インスタンス化時に各フォームに与えるコールバックメソッドを作成してください。コールバックメソッドは、Loadイベントの終了時(またはフォームの集計を処理するとき)にメインロジックを呼び出します。コールバックは、作成されたフォームの数を追跡し、「ループ」を終了します。あなたはその後、型アクション、またはパラメータを取らず、voidを返すカスタムという名前のデリゲートを、Form1にLoadCallbackプロパティを追加する必要があります

static volatile int formCount = 0; 

static void Main(string[] args) 
{ 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     ShowForms(5); 

     Application.Run(); 


} 

static void ShowForms(int formsLeft) 
{ 
    if(formsLeft == 0) return; 

    Random random = new Random();      

    int x = random.Next(0, 1000); 
    int y = random.Next(0, 1000); 

    Form1 form = new Form1 
    { 
     StartPosition = FormStartPosition.Manual, 
     ShowInTaskbar = false, 
     Location = new Point(x, y), 
     LoadCallback =()=>ShowForms(formsLeft - 1); 
    }; 

    form.FormClosed += (sender, e) => 
    { 
     if (--formCount > 0) 
     { 
      return; 
     } 

     Application.ExitThread(); 
    }; 

    formCount++; 
    form.Show();   
} 

それは次のようになります。 LoadCallback()を呼び出すと、フォームにデータを入力するメソッドの末尾に電話がかかります。フォームが生成されるまでフォームを1つ少なくしてこのコードに戻ります。

関連する問題