5

かなり奇妙な振る舞いを見つけました...

問題を再現する方法は次のとおりです。

  1. WPFアプリケーションプロジェクトを作成します。
  2. App.xamlファイルからStartupUriを削除します。
  3. private void Application_Startup(object sender, StartupEventArgs e)署名" "を使用してスタートアップイベントハンドラーをアプリに追加します
  4. 次に、フォームをプロジェクトに追加します(右クリックして[新しいアイテムの追加]を選択します)。
  5. Application_Startupメソッドで、フォームオブジェクトを作成し、次のように表示します。Form1 f1 = new Form1(); f1.ShowDialog();
  6. 実際のForm1で、デザイナーにボタンを追加し、ボタンにクリックイベントハンドラーを追加します。
  7. プロジェクトWindow1に新しいWPFウィンドウを追加します。
  8. 手順6で作成したForm1のボタンクリックイベントハンドラーで、WPFウィンドウの表示を作成するコード行を追加します。Window1 w1 = new Window1(); w1.Show();
  9. プロジェクトを実行し、winformのボタンをクリックして、WPFウィンドウを表示します...これまでのところ正常に機能しています。
    1. WPFウィンドウを閉じて、winformのボタンをもう一度クリックします。今回は例外が発生するはずです。

したがって、基本的に私が行うことは、winformを表示するWPFアプリケーションを作成することです。次に、winformはWPFウィンドウを表示します。

WPFウィンドウが初めて表示されるときは、すべて正常に機能します。閉じてから再度開くと、例外が発生します。ボタンを複数回クリックして、複数のWPFウィンドウを開くこともできます。ただし、最後の1つを閉じると、例外なく別の1つを再び開くことはできません...

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/442782b1-00a1-4e2e-9cc6-ae99b6699126/で提案されているさまざまなヒントも試しましたが、役に立ちません。

なぜこうなった?

4

1 に答える 1

10

デフォルトの Wpf アプリケーションのシャットダウン動作 (VS のプロジェクト プロパティの [アプリケーション] タブで指定するか、Application.Xaml の ShutdownMode 属性を使用して指定) は、「最後のウィンドウを閉じたとき」です。これは、作成した Wpf ウィンドウを閉じると、Wpf がアプリケーション フレームワークをシャットダウンするため、後続のウィンドウ作成で例外がスローされることを意味します。

この問題は、シャットダウン モードを "明示的なシャットダウン時" (Xaml では "OnExplicitShutdown") に設定することで回避できます。その後、アプリを終了させたい場合 (たとえば、winforms フォームが閉じられた場合) に、手動で Application.Current.Shutdown を明示的に呼び出す必要があります。

于 2009-02-06T16:33:06.657 に答える