2009-08-13 40 views
0

私はWPF UIを持っています。ボタンをクリックするとスレッドが開始されます。 スレッドからUIにいくつかのtxtbox値を読み込み、UIのテキストボックスをスレッドのステータスで更新したい場合WPFのハンドルからウィンドウを取得する方法

UIのハンドルをスレッドに渡してウィンドウを取得しようとしています(MFCのように)ハンドルから戻ってUIを更新します。

"IntPtr ParentHandle = new WindowInteropHelper(this).Handle;"という名前でハンドルを取得できます。

しかし、ハンドルからウィンドウを取得する方法はわかりません。

OR

私が更新し、スレッドからWPF UI上の値を盗んできる任意の他の方法はあります。

答えて

1

ハンドルを使用する必要はありません。オブジェクト参照を渡すだけです。 クラスを使用してスレッドを作成することができます。このクラスはobjectパラメーターをとります。したがって、スレッドがUIから値を取得する代わりに、スレッドに渡すすべての値のメンバーを含むオブジェクトを定義することができます。また、ウィンドウクラスへの参照を渡すことができるので、スレッドが完了したとき(または状態を更新するとき)は、その参照を使うことができます(Dispatcherを使ってコントロールを更新することを忘れないでくださいthis.Invoke

これは、次のようになります。

public class WPFWindow ... 
{ 
    private class ThreadData 
    { 
     public int Value1; 
     public string Value2; 
     public WPFWindow Window; 
    } 

    .... 

    private void StartThread() 
    { 
     ThreadData tdata = new ThreadData(); 
     tdata.Value1 = 42; 
     tdata.Value2 = "Hello World!"; 
     tdata.Window = this; 

     Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod)); 
     t.Start(tdata); 
    } 

    private void ThreadMethod(object data) 
    { 
     ThreadData tdata = (ThreadData)data; 

     // ... process values here 

     // Update controls 
     if(tdata.Window.textbox.Dispatcher.CheckAccess()) 
     { 
      // The calling thread owns the dispatcher, and hence the UI element 
      tdata.Window.textbox.AppendText(...); 
     } 
     else 
     { 
      // Invokation required 
      tdata.Window.textbox.Dispatcher.Invoke(DispatcherPriority.Normal, delegate); 
     } 
    } 
} 

を、私はこのWPFでtestetを持たずに盲目的にこれを書いていることに注意してください。これは、しかし、私はそれをすべての時間を行う方法です。 WinFormsで

+0

回答ありがとうございます。ちょうど1つの質問 else caseでのdelgateの実装はどうでしょうか – somaraj

+0

デリゲート(匿名メソッドでもよい)は、それぞれのコントロールを更新するだけです。 Dispatcherのウィンドウ自体をチェックして、すべてのコード更新コントロールをデリゲートに配置することもできます。サンプルはhttp://ascendedguard.com/2007/08/anonymous-functions-and-invoking-in-wpf.htmlにあります。 –

関連する問題