13


11

私のWPFアプリケーションでは、TextWriterTraceListenerを使ってテキストファイルにログを記録しています。 トレース出力をテキストボックスに表示する方法もありますか。

4 Answer


20


私はC#のwinformsのためにこれを使用し、簡単にwpfに調整可能であるべきです

パブリッククラスMyTraceListener:TraceListener {プライベートTextBoxBase出力;

public MyTraceListener(TextBoxBase出力){this.Name = "Trace"; this.output = output; }

public override void Write(文字列メッセージ){

アクションappend = delegate(){output.AppendText(string.Format( "[{0}]"、DateTime.Now.ToString())); output.AppendText(message); ; if(output.InvokeRequired){output.BeginInvoke(追加); } else {append();} }

}

パブリックオーバーライドvoid WriteLine(string message){書き込み(message Environment.NewLine); }}

好きに使う

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

Trace / Debug.Listeners.Remove(debugListener)を忘れないでください。もう必要ないとき


11


単純にトレースメッセージを文字列に追加するカスタムTraceListenerを実装するのはどうでしょうか。 次に、その文字列をプロパティとして公開し、INotifyPropertyChangedを実装して、TextBoxコントロールをそのプロパティにデータバインドします。

このようなもの:

パブリッククラスMyTraceListener:TraceListener、INotifyPropertyChanged {プライベート読み取り専用

public MyTraceListener(){this.builder = new StringBuilder(); }

パブリック文字列Trace {get {return this.builder.ToString();} }}

public override void書き込み(文字列メッセージ){this.builder.Append(メッセージ); this.OnPropertyChanged(new PropertyChangedEventArgs( "Trace")); }

public override void WriteLine(文字列メッセージ){this.builder.AppendLine(メッセージ); this.OnPropertyChanged(new PropertyChangedEventArgs( "Trace")); }

#region INotifyPropertyChangedメンバー

パブリックイベントPropertyChangedEventHandler PropertyChanged;

#endregion

OnPropertyChanged(PropertyChangedEventArgs e){PropertyChangedEventHandlerハンドラ= this.PropertyChanged; if(handler!= null){handler(this、e); }}}

このTraceListenerをアクティブリスナーのリストに追加する必要があります。

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


2


以下のコードは、@ Mark SeemannのコードのC#6.0スタイルです。

パブリッククラスMyTraceListener:TraceListener、INotifyPropertyChanged {プライベート読み取り専用StringBuilder _builder;

public MyTraceListener(){_builder = new StringBuilder();} }

パブリック文字列Trace => _builder.ToString();

public override void書き込み(文字列メッセージ){_builder.Append(メッセージ); OnPropertyChanged(new PropertyChangedEventArgs( "Trace")); }

public override void WriteLine(文字列メッセージ){_builder.AppendLine(メッセージ); OnPropertyChanged(new PropertyChangedEventArgs( "Trace")); }

#region INotifyPropertyChangedメンバー

パブリックイベントPropertyChangedEventHandler PropertyChanged;

#endregion

OnPropertyChanged(PropertyChangedEventArgs e){PropertyChanged?.Invoke(this、e); }}

MainViewModelがMainWindow.xamlファイルのルート「DataContext」であると仮定します。 `MyTraceListener`をMVVMの方法で適用するには、MainViewModel.csに以下のコードを書きます。

プライベート文字列_traceOutput;プライベート読み取り専用MyTraceListener _trace = new MyTraceListener();

// Constructor
public MainViewModel(){

// ...あなたのビューモデル初期化コード。

//ログをMainViewModel.TraceOutputプロパティに公開するためにイベントハンドラを追加します。 WeakEventManager.AddHandler(_trace、 "PropertyChanged"、traceOnPropertyChanged); Trace.Listeners.Add(_trace); }

private void traceOnPropertyChanged(オブジェクトセンダ、PropertyChangedEventArgs e){if(e.PropertyName == "Trace")TraceOutput = _trace.Trace; }

パブリック文字列TraceOutput {get {return _traceOutput;} {{traceOutput = value}を設定します。 RaisePropertyChanged(); //このメソッドはMvvm-lightからのものです。 }}

MainWindow.xamlで、 `TraceOutput`プロパティをTextBoxにバインドします。 蓄積されたログと共にTextBoxを一番下までスクロールさせたい場合は、 `TextChanged`イベントを適用してください。


XAMLファイル(MainWindow.xaml.cs)の分離コードでは、イベントハンドラは以下のようになります。

プライベートボイド}


0


Textbox.Textプロパティを更新するカスタムリスナーを追加することができます。 したがって、抽象基本クラスTraceListenerから継承し、TraaceData、TraceEvent、TraceTransferのいずれかのメソッドをオーバーライドする必要があります。