10

2つのフォームを使用して必要なすべてのコントロールを表示するwinformsアプリケーションがあります。最初のフォームはスプラッシュ画面で、ロード中などをユーザーに通知します。したがって、次のコードを使用しています。

Application.Run( new SplashForm() );

アプリケーションの読み込みが完了したら、SplashFormを非表示にするか、背面に送信してメインを表示します。私は現在以下を使用しています:

private void showMainForm()
{
    this.Hide();
    this.SendToBack();

    // Show the GUI
    mainForm.Show();
    mainForm.BringToFront();
}

私が見ているのは、MainFormが表示されているのに、SplashFormが「上」に表示されていることです。私が現在行っているのは、メインフォームをクリックして手動で前面に表示することです。なぜこれが起こっているのかについてのアイデアはありますか?

4

4 に答える 4

22

おそらく、スプラッシュフォームを閉じたいだけで、それを送り返したくないでしょう。

別のスレッドでスプラッシュ フォームを実行します (これはクラス SplashForm です)。

class SplashForm
{
    //Delegate for cross thread call to close
    private delegate void CloseDelegate();

    //The type of form to be displayed as the splash screen.
    private static SplashForm splashForm;

    static public void ShowSplashScreen()
    {
        // Make sure it is only launched once.

        if (splashForm != null)
            return;
        Thread thread = new Thread(new ThreadStart(SplashForm.ShowForm));
        thread.IsBackground = true;
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();           
    }

    static private void ShowForm()
    {
        splashForm = new SplashForm();
        Application.Run(splashForm);
    }

    static public void CloseForm()
    {
        splashForm.Invoke(new CloseDelegate(SplashForm.CloseFormInternal));
    }

    static private void CloseFormInternal()
    {
        splashForm.Close();
        splashForm = null;
    }
...
}

メインプログラム関数は次のようになります。

[STAThread]
static void Main(string[] args)
{
    SplashForm.ShowSplashScreen();
    MainForm mainForm = new MainForm(); //this takes ages
    SplashForm.CloseForm();
    Application.Run(mainForm);
}
于 2009-02-04T10:19:48.050 に答える
5

これは、スプラッシュ スクリーンがフォーカスを奪い、メイン フォームが閉じた後にバックグラウンドに移動するのを防ぐために重要です。

protected override bool ShowWithoutActivation {
    get { return true; }
}

これをスプラッシュ フォーム クラスに追加します。

于 2009-11-05T19:10:42.580 に答える
2

私が正しく理解していれば、メインフォームで Application.Run を使用するだけです。したがって、次のようなものを使用して、最初にスプラッシュを表示します。

using(MySplash form = new MySplash())
   form.ShowDialog();

その後、必要に応じていつでも MySplash で手動で閉じます。

または、メイン フォームの Load イベント ハンドラーで表示し、それが閉じるのを待つか、Load メソッドが完了するまで待ちます。(表示する前に Visible を false に設定し、後で true に戻すこともできます。

于 2009-02-04T10:24:55.373 に答える
1

私の現在の設計では、設計上の欠陥である可能性があると思います!

必要なことを達成するための最良の方法は、すべてを MainForm から制御することだと思います。だから私は使用することができます:

Application.Run(new MainForm());

これは、SplashScreen の表示/更新/非表示を担当します。このようにして、MainForm によって管理されるシステムの残りの部分と必要な複雑な相互作用を行うことができます。

于 2009-02-04T11:20:45.167 に答える