2009-08-13 4 views
0

WPF UI가 있습니다. 버튼을 클릭 할 때 스레드가 시작됩니다. UI에서 스레드에서 몇 가지 txtbox 값을 읽고 스레드의 상태로 UI에서 텍스트 상자를 업데이트하려고합니다.WPF에서 핸들을 가져 오는 방법

UI 핸들을 스레드로 전달하고 창을 가져 오려고합니다. (MFC에서와 같이) 핸들에서 되돌아와 UI를 업데이트하십시오.

"IntPtr ParentHandle = new WindowInteropHelper (this) .Handle;"로 핸들을 가져올 수 있습니다.

그러나 핸들에서 창을 가져 오는 방법을 모릅니다.

또는

이 내가 업데이트하고 스레드에서 WPF UI에 값을 retreive 수 anyother 방법입니다.

답변

1

핸들을 사용할 필요가 없습니다. 그냥 개체 참조를 전달하십시오. object 매개 변수를 사용하는 ParameterizedThreadStart 클래스를 사용하여 스레드를 만들 수 있습니다. 따라서 스레드가 UI에서 스레드를 검색하는 대신 스레드에 전달할 모든 값에 대한 멤버가 포함 된 객체를 정의 할 수 있습니다. 또한 윈도우 클래스에 대한 참조를 전달할 수 있으므로 스레드가 완료되면 (또는 상태를 업데이트 할 때) 참조를 사용할 수 있습니다. Dispatcher를 사용하여 컨트롤을 업데이트해야합니다. (수행 한 WinForms에서 ..

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없이 나는 이것을 쓰고 있습니다 이것은, 그러나, 그런데 내가 할 모든 시간 : this.Invoke)

이 다음과 같이 수

+0

답변을 주셔서 감사합니다. 단 하나의 질문입니다. else 케이스에서 델리게이트의 구현은 무엇입니까 – somaraj

+0

대리자 (익명 메서드 일 수도 있음)는 각 컨트롤을 업데이트하기 만합니다. Dispatcher에서 Window 자체를 확인한 다음 모든 코드 업데이트 컨트롤을 대리자에 넣을 수도 있습니다. 샘플은 http://ascendedguard.com/2007/08/anonymous-functions-and-invoking-in-wpf.html에서 찾을 수 있습니다. –

관련 문제