2016-09-12 2 views
1

私は、ロードに時間がかかる.Net Winformアプリケーションがあります。スプラッシュスクリーンWinforms

私は私のアプリケーションは、スプラッシュスクリーンを通してup.Basically開いたときに、私はする必要があります私のアプリケーション

スプラッシュ画面の初期化プロセスをmoniterしたい、私は自分のアプリケーションをクリックしたときに開始し、閉じますスプラッシュスクリーンを作成したい

別のwinformと別のスレッドで実行する必要があります。

スプラッシュ画面で[Stop Waiting]ボタンをクリックして、ユーザーがアプリケーションのオープンをキャンセルできるようにしたい場合は、アプリケーションをシャットダウンする必要があります。

また、スプラッシュ画面では、アプリケーションの初期化の進捗状況を表示する必要があります。

私はスプラッシュスクリーンに関する知識が非常に限られています。私の要求を進めるにはいくつかの例を教えてください。

もう1つの質問スプラッシュ画面を実装した後: 私のアプリケーションの初期化は別のプロジェクトで起こるので、私はスプラッシュ画面の別のプロジェクトでそれを使い、スプライト画面を追加することをお勧めします。 )をメイン画面のリファレンスとして使用し、スプラッシュ画面でメソッドを使用しますか?

ご協力いただきありがとうございます。

+0

[このようなソリューション](http://stackoverflow.com/questions/32418695/show-splash-screen-during-loading-the-main-form)を使用することができます。その後、スプラッシュ画面で、クリックすると 'Application.Exit();'を呼び出すボタンがあれば十分です。 –

+0

アプリケーションのメインフォームのコードのどの部分が終了するのに時間がかかりますか? – Niklas

答えて

2

これはたくさんの質問ですが、「スプラッシュ画面の作成方法」に回答してから、初期化の進行状況をキャンセルして表示することができます。

基本的には、スプラッシュフォームとして機能する別のフォームを作成します。

プロパティを設定します:

  • 開始位置= FormStartPosition.CenterScreen
  • MaximizeBox = falseを
  • FormBorderStyle = FormBorderStyle.None
  • そして、あなたが次に

をしたい場合は背景画像を読み込みますメインウィンドウにスプラッシュ画面を作成して表示し、参照を渡す前にメインウィンドウオブジェクト

Splash splash = new Splash(); 
splash.Show(); 

MainWindow wnd = new MainWindow(splash); 

そして、あなたのメインウィンドウのMainWindowLoad_Load関数の中に:

public MainWindow(Splash splash) 
{ 
    mSplash = splash; 
} 
private void MainWindow_Load(object sender, System.EventArgs e) 
{ 
    // do long initialisation, and when done.... 

    mSplash.Close(); 
    mSplash = null; 

} 
+0

これはどのように別のスレッドで実行され、長い初期化が行われたときにmSplashフォームのUIスレッドをブロックしないのですか? – Niklas

+0

@ServéLaurijssen私のアプリケーションの初期化はさまざまなプロジェクトで発生するので、Splash Screenの別々のexeファイルを作成し、メインScreenの別のプロジェクトで使用しています。メイン画面の参照としてスプラッシュ画面(exe)を追加し、スプラッシュスクリーンで? – reddy

0

スプラッシュ画面がルックアンドフィールについてですので、私はあなたがUIスレッドがそれを処理させることを示唆しています別の実行スレッドにコードを入れてください。スプラッシュ画面の表示に何かを変更するには、BeginInvokeが必要です。したがって、
これはそれを行うための私の方法です:あなたはBackgroundWorkerのは、その比率を変更させるためには、あなたのプログレスバーコントロールの修飾子がパブリックにする必要があり

private void MainForm_Load(object sender, EventArgs e) 
{ 
    LoadingForm _loading = new LoadingForm(); 
    BackgroundWorker _worker = new BackgroundWorker { WorkerReportsProgress = true }; 
    _worker.ProgressChanged += (o, z) => 
    { 
     _loading.progressBar1.Minimum = 0; 
     _loading.progressBar1.Maximum = 100; 
     _loading.progressBar1.Value = (z as ProgressChangedEventArgs).ProgressPercentage; 
    }; 
    _worker.RunWorkerCompleted += (fWorker, fargs) => 
    { 
     _loading.Dispose();// this is executed when all the code in dowork event is completed,disposing the loading form and continuing your code 
    }; 
    _worker.DoWork += (workerO, workerArgs) => 
    { 
     // execute your code here , update progressbar as you go: 
     int yourProgress = 0;//need to generate this in your code as percentage 0-100 
     _worker.ReportProgress(yourProgress); 


     //////////////////////////just to show progress change////////////////////////////// 
     for (int i = 0; i < 5; i++) 
     { 
      Thread.Sleep(1500); 
      yourProgress += 20; 
      _worker.ReportProgress(yourProgress); 
     } 
     Thread.Sleep(3000); 
     //////////////////////////////////////////////////////////////////////////////// 

    }; 
    _worker.RunWorkerAsync(); 



    _loading.ShowDialog(this); 


} 

ノート。

+0

私のアプリケーションの初期化はさまざまなプロジェクトで起こるので、Splash Screenの別々のexeファイルを作成し、メインScreenの別のプロジェクトで使用します。スプラッシュ画面(exe)をメイン画面のリファレンスとして追加し、Splash Screen ? – reddy

関連する問題