对于我的WPF应用程序,我使用TextWriterTraceListener记录到文本文件。我怎样才能将Trace输出显示到文本框?跟踪监听器写入文本框(WPF应用程序)
12
A
回答
18
我用这个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);
记住跟踪/ Debug.Listeners.Remove(debugListener);当你不再需要它时。
0
您可以附加一个自定义侦听器,它更新Textbox.Text属性。 因此,您需要从抽象基类TraceListener继承并重写TraceData,TraceEvent,TraceTransfer方法之一。
11
如何实现一个自定义的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());
2
下面的代码是@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<INotifyPropertyChanged, PropertyChangedEventArgs>.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
属性为文本框。如果您希望文本框随累积日志一起滚动到底部,请应用TextChanged
事件。
<TextBox x:Name="TextBoxLog" TextWrapping="Wrap" Text="{Binding TraceOutput}" VerticalScrollBarVisibility="Auto" AcceptsReturn="True" TextChanged="TextBoxLog_OnTextChanged" />
在XAML文件(MainWindow.xaml.cs)的代码隐藏中,事件处理程序简单如下。
private void TextBoxLog_OnTextChanged(object sender, TextChangedEventArgs e)
{
TextBoxLog.ScrollToEnd();
}
相关问题
- 1. DocumentDB跟踪监听器
- 2. 诊断监视器跟踪监听器
- 3. 使用多个跟踪监听器
- 4. 监控应用程序/跟踪内存
- 5. 通过使用“TextWriter”跟踪侦听器跟踪写入事件日志
- 6. Tomcat应用程序部署监听器
- 7. 基于XmlWriterTraceListener的线程安全跟踪监听器
- 8. 跟踪应用程序
- 9. 把应用程序跟踪
- 10. 跟踪Web应用程序
- 11. ASP.NET应用程序 - 跟踪
- 12. Django跟踪应用程序?
- 13. 无法用spring-cloud-sleuth跟踪spring-cloud-stream监听器
- 14. 将复选框监听器放入按钮监听器
- 15. 跟踪值文本框
- 16. 如何监控.Net应用程序的跟踪输出?
- 17. 跟踪富文本框文本?
- 18. 更改应用程序配置/资源文件的监听器
- 19. 跟踪监听器 - 创建内存溢出
- 20. 企业库数据库跟踪监听器?
- 21. 撒克逊-B跟踪监听器控制
- 22. .Net Windows服务和自定义跟踪监听器
- 23. 日志记录应用程序块:数据库跟踪侦听器时间戳
- 24. 从WPF XBAP应用程序跟踪日志记录
- 25. 如何在jboss中写入跟踪以分离跟踪文件
- 26. 错误配置应用程序监听
- 27. 用户跟踪应用程序被
- 28. 跟踪使用的应用程序
- 29. 写入跟踪过程的内存。
- 30. 写端口监听器
BeginInvoke()的+1。常规调用()会挂起整个应用程序。 – sharkin 2009-10-07 19:50:42
你的意思是'new * My * TraceListener(theTextBox)' – 2010-01-21 16:31:32
什么是'wpf等效' – 2016-07-12 10:02:17