2017-08-21 5 views
0

同じメソッドを2回実行すると恐ろしいです。WPF画面が表示されないのはなぜですか? 2回目をクリックしても何も起こらない

TestWindowボタンのクリック方法私のコード参照してください(これは、Windowsアプリケーションのプロジェクトタイプである)と私は私の

メイン()でSTAスレッドが削除されている

TestClass test;

private void button1_Click(object sender, EventArgs e) 
{ 
    test =TestClass.Instance; //singleton pattern 
    test.ShowScreen(); 
} 

TestClass

public void ShowScreen() 
{ 
    var thread = new Thread(() => 
     { 
      Explorer explorer = new Explorer(); 
      explorer.Show(); 
      explorer.Closed += (s, args) => 
       explorer.Dispatcher.InvokeShutdown(); 

      System.Windows.Threading.Dispatcher.Run(); 
     }); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start();    
} 

最初のコードを実行するとコードが正常に機能します。エクスプローラの画面を見ることができます。 しかし、最初の画面を閉じて同じメソッド(test.ShowScreen();)を呼び出すとエクスプローラの画面が表示されない

注:私は気づいた私は最初のウィンドウを閉じなかった場合インスタンス)私は多くのエクスプローラ画面を開くことができます。同じコードを使用します。 最初のウィンドウ(インスタンス)を閉じても、エクスプローラを開くことができず、エラーメッセージが表示されない場合

+0

に以下の行を追加する解決されたそれは、 'TestClass'が適切に閉じ取得されていないのインスタンスようです。あなたは同じもののために何をコーディングしましたか? –

+0

TestClassは**シングルトンのパターン**を使用しています。このような実際のコードは 'testObj = TestClass.Instance;' –

+0

です。これは読んでいるようですが、これを読んでください[シングルトンは自分自身の作成され、通常はそのインスタンスに簡単にアクセスできます。最も一般的には、シングルトンは、インスタンスの作成時にパラメータを指定することを許可しません。そうしないと、インスタンスの2番目の要求が異なるパラメータで問題になる可能性があります。同じパラメータを持つすべてのリクエストに対して同じインスタンスにアクセスする必要がある場合は、工場パターンが適切です。]](http://csharpindepth.com/Articles/General/Singleton.aspx) –

答えて

1

問題がTestClassをコンストラクタ

using SW = System.Windows;

private TestClass() 
{ 
    if (SW.Application.Current == null) 
    { 
     new SW.Application 
     { 
      ShutdownMode = SW.ShutdownMode.OnExplicitShutdown 
     }; 
    } 
} 
関連する問題