2016-07-05 3 views
-1

명령 창에 텍스트를 인쇄하는 콘솔 응용 프로그램이 있다고 가정합니다. 또한 출력을 복제해야하는 Logger WPF 창이 있습니다. IDE는 새 스레드 (STA) 내부의 창을 만들 나를 강제 : 스레드가 시작된 후콘솔 응용 프로그램에서 UI 요소에 액세스하는 방법

public SomeClass() 
{ 
    var loggerThread = new Thread(() => 
    { 
     var logWindow = new Window 
     { 
      Title = "Logger", Width = 100, Height = 100 
     }; 

     var stackPanel = new StackPanel 
     { 
      Name = "stackPanel" 
     }; 

     stackPanel.Children.Add(new TextBlock 
     { 
      Name = "textBlock", Text = "new text\n" 
     }); 

     logWindow.Content = stackPanel; 
     logWindow.ShowDialog(); 
    }); 

    loggerThread.SetApartmentState(ApartmentState.STA); 
    loggerThread.IsBackground = true; 
    loggerThread.Start(); 
} 

public void PutInfo(string msg) 
{ 
    // how to access textBlock here? 
    ...textBlock.Text = "some info"; 
} 

가 어떻게 textBlock.Text에 액세스 할 수 있습니다. 즉, PutInfo() 메소드를 통해 다른 클래스의 해당 스레드에서 UI 요소에 액세스하는 방법은 무엇입니까?

당신은 라인의 몇 여기 교차 한
+1

검색을 사용하여 Description을 변경합니다. 알아두기 이것은 예 : http://stackoverflow.com/questions/11625208/accessing-ui-main-thread-safely-in-wpf – Andre

답변

1

는 콘솔 응용 프로그램은 WPF 응용 프로그램은 WPF 인터페이스를 정의하는 그래픽 사용자 인터페이스를 가지고 응용 프로그램입니다

없는 그래픽 요소

와 응용 프로그램입니다. 당신은 당신이 사용자 System.Diagnostics 네임의 프로세스 클래스 캡처 할 수있는 GUI에서 콘솔 응용 프로그램의 출력을 기록하려는 경우

그렇게 정의하여 콘솔 응용 프로그램은 이제 GUI

를 가질 수 없습니다 및 여기에 잘 설명되어있는 콘솔 출력 채널을 표시하십시오. 콘솔 응용 프로그램이 다른 GUI 응용 프로그램 컨트롤을 직접 제어하게하려는 경우 메모리 관리를 위반하고 관리되지 않는 메모리 포인터를 사용하여 검사해야하지만 권장하지는 않지만이 방법을 사용하는 것이 좋습니다. Capturing console output from a .NET application (C#)

만약 당신이 jus WPF의 TextBlock의를 업데이트하려고 t는 그 간단 단지 중 관찰 수집 또는 다음에서 INotifyPropertyChanged를 구현하고 문자열 속성에 텍스트를 저장하여 로거 클래스 관찰로 설정 업데이트 할 바인딩을 사용 예를 들어

public class Logger:INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged 
    private string _Description; 
    public static readonly PropertyChangedEventArgs DescriptionProperty = new PropertyChangedEventArgs(nameof(Description)); 

    public string Description 
    { 
     get { return _Description; } 
     set 
     { 
      _Description = value; 
      PropertyChanged?.Involke(this, DescriptionProperty); 
     } 
    } 
} 

모든이가 컨트롤 다음

<TextBox Text="{Binding Description, source="Your Logger"}"/> 

마다 시간을 업데이트하는 데 필요한 다음이 당신은 세터에게 TextBlock의 업데이트 SynchronizationContext에 대한 자동

+0

새 스레드 창을 만듭니다. 문제는 텍스트 필드를 업데이트하기 위해 다른 클래스의 창 UI 요소에 액세스하는 것입니다. – andreikashin

+0

당신이 원한다면 텍스트를 업데이 트하는 것입니다 다음 대량으로 복잡하고 이상하게 질문을 말한 있습니다. WPF를 바인딩하는 방법을 보여주는 업데이트 된 답변 – MikeT

관련 문제