4

私の仕事の要件は、最初にユーザーからいくつかのデータを取り込み、彼を認証して別のフォームを開始するスプラッシュ画面を表示することです。そのため、Application.Run を使用してスプラッシュ スクリーンを開始しています。完了したら、Application.Exit を呼び出してから、新しいフォームに対して再度 Application.Run を呼び出します。しかし、これは新しいフォームを開始しません。新しいスレッドを作成し、その ApartmentModel を STA として割り当てて、新しいフォームを開始します。

Application.Exit を呼び出した後に Application.Run が機能しない理由を知りたいですか?

サンプルコード:

        Application.Run(SplashForm);  

        if (_authorizationSuccessful)
            Application.Run(new Form2())
        else
        {
            //just close
        }
4

5 に答える 5

3

かなり複雑ですが、アプリケーションを存続させるのは実際にはフォームではないという中心的な問題です。コア ヘルパー クラスは ApplicationContext で、これも Application.Run() のオーバーロードの 1 つとして公開されています。他のオーバーロードである Run() と Run(Form) を使用すると、Application クラスは ApplicationContext の隠しインスタンスを作成します。アプリケーションのすべてのプロパティとメソッドと同様に、これはグローバルです。

したがって、Application.Exit() を呼び出すと、ApplicationContext のグローバル インスタンスが「アクティブではなくなった」とマークされます。Run(Form) への次の呼び出しをすぐに終了します。

この問題を解決する代わりに、独自の ApplicationContext インスタンスをモンキーすることができます。しかし定型的な解決策は、ログイン フォームで ShowDialog() メソッドを使用することです。また、「ログインは良好です。続行しましょう」状態を返す良い方法として、DialogResult が役立ちます。

于 2012-10-12T23:55:44.203 に答える
0

このようにしてください

new SplashScreenForm().ShowDialog();//show splash screen and take user input
new MainForm().Show();//now show the main form
Application.Run();//starts the app

また

if (new SplashScreenForm().ShowDialog() == DialogResult.OK)//if its ok to start another form
{
    Application.Run(new MainForm());
}

ノート

Application.Run(Form)は、現在のスレッドでメッセージループを開始し、指定されたフォームを表示します。メッセージループにより、フォームはWindowsメッセージ(キーの押下、マウスのクリック、ペイントの無効化など)を受信できるようになり、応答性が高く、ユーザーと対話できるようになります。

したがって、実行するとApplication.Exit()、特定のフォームではなく、アプリ全体が閉じられます

于 2012-10-11T06:42:13.020 に答える
0

すべてを解体するのではなく、再び構築するために、次のことを行ってみませんか。

var f1 = new Form1();
f1.Show();
Application.Run();

Form1スプラッシュスクリーンの場所。次に、メイン画面を表示する準備ができたら、次のことを実行できます。

var f2 = new Form2();
f2.Show();
this.Close();

Form2メイン画面はどこ?(単一の) メッセージ ループはずっと実行され続けます。

于 2012-10-11T07:06:38.970 に答える
0

最初に、このフォームでメイン フォーム (この場合は 2 番目のフォーム) を表示する必要があります。メイン フォームが非表示になるまで、スプラッシュ スクリーン (認証) を呼び出す必要があります。スプラッシュ スクリーンでは、Application.Exit() の代わりに this.Close() を使用する必要があります。スプラッシュ スクリーンを閉じた後、メイン フォームを表示する必要があります。

于 2012-10-11T04:53:36.133 に答える