對於我的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. 「文本框的監聽器」
- 6. 如何寫入跟蹤在配置文件中定義的監聽器
- 7. 通過使用「TextWriter」跟蹤偵聽器跟蹤寫入事件日誌
- 8. Tomcat應用程序部署監聽器
- 9. 基於XmlWriterTraceListener的線程安全跟蹤監聽器
- 10. 跟蹤Web應用程序
- 11. 跟蹤應用程序
- 12. Django跟蹤應用程序?
- 13. ASP.NET應用程序 - 跟蹤
- 14. 把應用程序跟蹤
- 15. 監控和跟蹤工作流程應用程序實例
- 16. 如何告訴用戶一個監聽器的.NET跟蹤源?
- 17. 無法用spring-cloud-sleuth跟蹤spring-cloud-stream監聽器
- 18. 使用跟蹤監聽器重定向所有調試輸出
- 19. Edittext文本輸入監聽器
- 20. 將複選框監聽器放入按鈕監聽器
- 21. 跟蹤值文本框
- 22. 如何獲取跟蹤監聽器過濾器信息級別?
- 23. 如何監控.Net應用程序的跟蹤輸出?
- 24. 活動監視器(程序時間跟蹤器)
- 25. 跟蹤富文本框文本?
- 26. 更改應用程序配置/資源文件的監聽器
- 27. 使用USB跟蹤跟蹤Android應用程序
- 28. 跟蹤監聽器忽略traceOutputOptions =「日期時間」
- 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