跟踪侦听器写入文本框(WPF应用程序)

对于我的WPF应用程序,我使用TextWriterTraceListener记录到文本文件。 如何将跟踪输出显示到文本框?

我用这个用于C#winforms,应该很容易调整为wpf

public class MyTraceListener : TraceListener { private TextBoxBase output; public MyTraceListener(TextBoxBase output) { this.Name = "Trace"; this.output = output; } public override void Write(string message) { Action append = delegate() { output.AppendText(string.Format("[{0}] ", DateTime.Now.ToString())); output.AppendText(message); }; if (output.InvokeRequired) { output.BeginInvoke(append); } else { append(); } } public override void WriteLine(string message) { Write(message + Environment.NewLine); } } 

用它就好

 TraceListener debugListener = new MyTraceListener (theTextBox); Debug.Listeners.Add(debugListener); Trace.Listeners.Add(debugListener); 

记得Trace / Debug.Listeners.Remove(debugListener); 当你不再需要它的时候。

如何实现一个只是将跟踪消息附加到字符串的自定义TraceListener? 然后,您将该字符串作为属性公开,实现INotifyPropertyChanged并将TextBox控件数据绑定到该属性。

像这样的东西:

 public class MyTraceListener : TraceListener, INotifyPropertyChanged { private readonly StringBuilder builder; public MyTraceListener() { this.builder = new StringBuilder(); } public string Trace { get { return this.builder.ToString(); } } public override void Write(string message) { this.builder.Append(message); this.OnPropertyChanged(new PropertyChangedEventArgs("Trace")); } public override void WriteLine(string message) { this.builder.AppendLine(message); this.OnPropertyChanged(new PropertyChangedEventArgs("Trace")); } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChangedEventHandler handler = this.PropertyChanged; if (handler != null) { handler(this, e); } } } 

您需要将此TraceListener添加到活动侦听器列表中:

 Trace.Listeners.Add(new MyTraceListener()); 

下面的代码是@Mark Seemann代码的C#6.0风格。

 public class MyTraceListener : TraceListener, INotifyPropertyChanged { private readonly StringBuilder _builder; public MyTraceListener() { _builder = new StringBuilder(); } public string Trace => _builder.ToString(); public override void Write(string message) { _builder.Append(message); OnPropertyChanged(new PropertyChangedEventArgs("Trace")); } public override void WriteLine(string message) { _builder.AppendLine(message); OnPropertyChanged(new PropertyChangedEventArgs("Trace")); } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChanged?.Invoke(this, e); } } 

假设MainViewModel是MainWindow.xaml文件的根DataContext 。 要以MVVM方式应用MyTraceListener ,请在MainViewModel.cs中编写以下代码。

 private string _traceOutput; private readonly MyTraceListener _trace = new MyTraceListener(); // Constructor public MainViewModel() { // ...your viewmodel initialization code. // Add event handler in order to expose logs to MainViewModel.TraceOutput property. WeakEventManager.AddHandler(_trace, "PropertyChanged", traceOnPropertyChanged); Trace.Listeners.Add(_trace); } private void traceOnPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "Trace") TraceOutput = _trace.Trace; } public string TraceOutput { get { return _traceOutput; } set { _traceOutput = value; RaisePropertyChanged(); // This method is from Mvvm-light. } } 

在MainWindow.xaml中,将TraceOutput属性绑定到TextBox。 如果您希望TextBox与累积日志一起滚动到底部,请应用TextChanged事件。

  

在XAML文件(MainWindow.xaml.cs)的代码隐藏中,事件处理程序如下所示。

  private void TextBoxLog_OnTextChanged(object sender, TextChangedEventArgs e) { TextBoxLog.ScrollToEnd(); } 

您可以附加一个更新Textbox.Text属性的自定义Listener。 因此,您需要从抽象基类TraceListenerinheritance并覆盖TraaceData,TraceEvent,TraceTransfer方法之一。