2016-08-10 10 views
1

私はC#とWPFを具体的に学習しています。私は現在書かれているプログラムを持っていますが、それは問題を解決しています。ユーザーがメインウィンドウを閉じると、プログラムは終了しますが、プロセスはバックグラウンドで実行され続けます。新しいウィンドウが開くたびに、新しいプロセスが作成され、終了しません。これは、「プロセスを閉じますが、それは間違ってプログラムのシャットダウンのような役割を果たしポップアップするウィンドウを引き起こし、を促すWPF C#WindowsはApplication.Current.Shutdown()で "アプリケーションが動作を停止しました"をスローします。

private void InventoryUpdater_Closed(object sender, EventArgs e) 
     { 
      Application.Current.Shutdown(); 
     } 

:私は私のMainWindow.xaml.csファイルに次のコードを追加することでこの問題を修正しようとしましたプログラムを閉じる"。そのウィンドウの状態、「[アプリケーション名]は動作を停止しました。私は私のアプリケーション・プロセスは、それがユーザーに彼らがクローズするたびにメッセージを表示せずに終了することができますか?それは私が適切に何かを配置されていませんでしたことは可能です

どう?

+0

代わりに 'Environment.Exit(0)'? – user3185569

+0

'Environment.Exit(0);'はプロセスを終了しません。これを試すと、アプリケーションウィンドウが閉じられるだけですが、プロセスは実行され続けてスタックされます。 – Hank

+0

これは当てはまりません。ドキュメントの状態:*他のスレッドが実行中であっても、Exitによってアプリケーションが即座に終了する*:https://msdn.microsoft.com/en-us/library/system.environment.exit(v=vs.110).aspx – user3185569

答えて

1

は、だから私はプロンプトを引き起こしていたし、何が終わりのないプロセスを引き起こしていたものを考え出した。

プロンプトが他の3つの窓の私の開閉としなければならなかった。ここで私はApplication.Current.Shutdown()からエラーを取得して停止するように変更するものですこのコードを変更しました:

private void settingsWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     updateSettings(); 
     e.Cancel = true; 
     main.Show(); 
     Hide(); 
    } 

private void settingsButton_MouseUp(object sender, RoutedEventArgs e) 
    { 
     settingsWindow settingsWindow = new settingsWindow(this); 
     if (!settingsWindow.settingsOpen) 
     { 
      settingsWindow.Show(); 
      Hide(); 
     } 
    } 
01このコードに

private void settingsWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     updateSettings(); 
    } 

private void settingsButton_MouseUp(object sender, RoutedEventArgs e) 
    { 
     settingsWindow settingsWindow = new settingsWindow(this); 
     if (!settingsWindow.settingsOpen) 
     { 

      settingsWindow.ShowDialog(); 
     } 
    } 

私はそれが私が負荷に初期化されていたし、彼らのクロージングイベントを巡回して、他のウィンドウのインスタンスを通じて戻ったmainを閉じたら。 main.Show()になったら、既に閉じていたものを表示できませんでした。

これを実行した後、Loadedイベントで追加のウィンドウを元々初期化していたため、追加のトレースバックが終了していないことがわかりました。ここに私が変えたものがあります。初期化がまだそこにいた、なぜ私もよく分からない

private void InventoryUpdater_Loaded(object sender, RoutedEventArgs e) 
    { 
     TimeSpan na = queueCustomTask(); 
     Stop = true; 
     runManually.IsEnabled = true; 
     ssdRunManually.IsEnabled = true; 
     startAutoRun.IsEnabled = true; 
    } 

:これに

private void InventoryUpdater_Loaded(object sender, RoutedEventArgs e) 
    { 
     settingsWindow settings = new settingsWindow(this); 
     sftpSettings severSettings = new sftpSettings(settings); 
     TimeSpan na = queueCustomTask(); 
     Stop = true; 
     runManually.IsEnabled = true; 
     ssdRunManually.IsEnabled = true; 
     startAutoRun.IsEnabled = true; 
    } 

:私はこれを変更しました。すべてが静的なグローバル変数に切り替えられていたので、それらの2行を削除すると何も影響を受けませんでした。すべてのショーを正しい方向に感謝します!

関連する問題