4

セットアップダイアログ(親)が表示されるプロジェクトがあります。ユーザーが続行を押すと、メインダイアログが開きます(子)。メインダイアログ内から、ユーザーはセットアップダイアログ(親)を再編集できます。ユーザーがXをクリックしてセットアップダイアログを閉じると、アプリケーションは終了します。これは、親を閉じて、すべての子を破棄するためだと思います

メインダイアログ(子)を閉じずに親を閉じる(または非表示にする)ことは可能ですか?そうでない場合、次の修正が機能しますか?親としてメインダイアログを開き、セットアップダイアログを開くようにします(子)

4

2 に答える 2

8

このProgram.csファイルには、おそらく次のような関数があります。

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

この関数は、アプリケーションのエントリポイントです。このApplication.Run()関数は、アプリケーションのメインループを実行します。グラフィカルアプリケーションのメインループは、イベントハンドラーがイベントをトリガーしたり、UIが更新されたりする場所です。イベント(ボタンを押すなど)の処理に時間がかかりすぎると、UIがハングします。これを防ぐために、スレッドを使用できます。

関数がオーバーロードされているため、Application.Run()関数にパラメーター(new Form1()この場合)がある場合、フォームは「メイン」フォームになり、フォームが閉じられるとメインループが終了します。

この問題を修正するには、パラメーターを削除する必要があります。これにより、フォームが閉じたときにメインループが閉じずに実行されます。

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

ただし、これにより2つの問題が発生します。

  1. 関数からフォームを削除したため、起動時にフォームは表示されませんMain。これを修正するには、main関数で新しいフォームを作成し、それを表示する必要があります。

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
    
        Form1 form = new Form1();
        form.Show();
    
        Application.Run();
    }
    
  2. フォームを閉じても、アプリケーションは終了しません。すべてのフォームを閉じても、プロセスは引き続き実行されるためApplication.Exit();、アプリケーションを終了するときに呼び出す必要があります(フォームを閉じるイベントなど)。

于 2012-09-08T11:12:52.353 に答える
0

または、モーダルウィンドウが親なしでは生きられないことを理解できないだけです。親が最小化されると、すべてのモーダル フォームが非表示になりました。親が閉じられると、モーダル フォームにも同じことが起こります。

したがって、親が死んだ後も生き続けるようにモデル フォームを騙すのは悪い習慣です。2 番目のフォームが最初のフォームと同じであるというパターンにとどまるようにしてください。

于 2012-09-08T13:13:09.520 に答える