2016-07-05 146 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

搜索的SynchronizationContext改變Description。 順便說一句我認爲這是例如http://stackoverflow.com/questions/11625208/accessing-ui-main-thread-safely-in-wpf – Andre

回答

1

你已經跨過幾行這裏, 一個控制檯應用程序是不帶圖形元素

一個WPF應用程序是與WPF定義界面的圖形用戶界面的應用程序的應用程序。

因此通過定義一個控制檯應用程序不能有一個GUI

現在,如果你想記錄一個控制檯應用程序的輸出在GUI中,那麼你可以在用戶的​​System.Diagnostics程序過程類捕獲和顯示控制檯輸出通道,這裏很好地解釋Capturing console output from a .NET application (C#)

如果你想要控制檯應用程序直接控制不同的GUI應用程序控制,那麼你是違反內存管理,應該看看使用非託管內存指針,雖然我不會推薦這

如果你是強制性的牛逼試圖更新一個WPF TextBlock的那麼簡單,只需將您的Logger類可觀察到無論是存儲可觀察集合或實現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"}"/> 

,那麼你使用二傳手的文本塊將自動更新

+0

它在一個新的線程中創建一個窗口。問題是從其他類訪問窗口的UI元素以更新文本字段。 – andreikashin

+0

如果你想要的只是更新文本,那麼你會大量複雜化,而且措辭不佳。更新的答案來展示如何綁定WPF – MikeT

相關問題