2011-06-01 14 views
1

非モデルウィンドウ(WPF)を開いていますが、これが発生する必要がある時点で私はSTAスレッドではありません。だから私は新しいスレッドを開始し、そこにそれらを開きます。しかし開かれるとすぐに、彼らは再び閉じます。 (ちなみに。これらのウィンドウの挙動は、メインウィンドウから独立していなければならない。だから、何の所有者プロパティが設定されていない)私はここで間違って何をやっている新しいSTAスレッドで非モーダルウィンドウが閉じるのを防ぐ方法

private void SomeMethod_OnA_NON_STA_Thread() 
{ 
    // some other work here 

    Thread ANewThread = new Thread(OpenSomeWindows); 
    ANewThread.SetApartmentState(ApartmentState.STA); 
    ANewThread.Start(); 
} 


private void OpenSomeWindows() 
{ 
    TestWindow T; 

    for (int i = 0; i < 3; i++) 
    { 
     T = new TestWindow(); 
     T.Show(); 
    } 
} 

答えて

3

あなたはあなたの窓に住みたい場合は、あなたがそれらを作成した後、あなたがメッセージループを開始する(そうでなければ、あなたのスレッドがちょうど出て、窓が自分自身をレンダリングする機会を持っていません)があります。

private void OpenSomeWindows() 
{ 
    for (int i = 0; i < 3; i++) 
    { 
     TestWindow T = new TestWindow(); 
     T.Show(); 
    } 
    Dispatcher.Run(); // <--------- 
} 

(中メインスレッドは、メッセージループはあなたのためのフレームワークによって作成された)

PS:私は窓がガベージコレクトすることができるかどうかわからないので、私はどこかへの参照を保持します:

List<TestWindow> windows = new List<TestWindow>(); 
for (int i = 0; i < 3; i++) 
{ 
    TestWindow t = new TestWindow(); 
    t.Show(); 
    windows.Add(t); 
} 
Dispatcher.Run(); 
を210

P.P.S:あなたのウィンドウをメインスレッドで実行したいのですか?実際にこれを行うことができます。次のものだけが必要です:

private void SomeMethod_OnA_NON_STA_Thread() 
{ 
    // some other work here 
    Application.Current.Dispatcher.Invoke(OpenSomeWindows); 
} 

private void OpenSomeWindows() 
{ 
    for (int i = 0; i < 3; i++) 
    { 
     TestWindow T = new TestWindow(); 
     T.Show(); 
    } 
    // this way, no Dispatcher.Run is needed 
} 
+0

Thx !!!!!今それは動作します。もう一度私はこのディスパッチャーのことをもっと読まなければならないことがわかります。 –

+0

最後の更新を読む... – Vlad

+1

この最後の反復:(Application.Current.Dispatcher.Invoke(OpenSomeWindows);)は、(IMHO)は、特にスレッドを書くときに、さまざまなスレッド間でUIを処理する最善の方法ですすばやく何かを学び、再学習する必要はありません。私はそれが悪いことを知っていますが、プロトタイプや小規模なプロジェクトでは、時にはうまくいくものがほしいのです。 –

0

スレッドは、呼び出し元メソッドの最後に終了します。 ANewThreadをフィールドにします(クラス/フォームレベルで宣言します)。

関連する問題