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

相关问题