誰かがこの問題に遭遇したことがあるかどうか疑問に思っています。WPF アプリケーションの RichTextBox にすべてのログ イベントを表示しようとしていますが、UserControl の IAppender インターフェイスを使用してグローバル Appender を追加できると考えました。
BackgroundWorker を使用して、バックグラウンドで「長時間実行」プロセスを実行し、DoWork イベント中に logger.Info("text") イベントを作成しています。
私が抱えている問題は、DoAppend イベントが発生し、Dispatcher イベント中にテキストが更新されたように見えますが、UI にはこれが反映されていません。
ここに私の LogAppender クラスがあります:
public partial class LogAppender : UserControl, IAppender
{
public LogAppender()
{
InitializeComponent();
}
public void Close()
{
}
public log4net.Layout.PatternLayout Layout
{
get;
set;
}
public void DoAppend(log4net.Core.LoggingEvent loggingEvent)
{
this.LogTextBlock.Dispatcher.Invoke(
DispatcherPriority.Normal,
new Action(
delegate
{
StringWriter writer = new StringWriter();
this.Layout.Format(writer, loggingEvent);
this.LogTextBlock.AppendText(writer.ToString());
}));
}
}
<UserControl>
<Grid>
<RichTextBox x:Name="LogTextBlock"/>
</Grid>
</UserControl>
ここに私の MainWindow.xaml ボタンのクリックと backgroundworker コードがあります:
public partial class MainWindow
{
protected static readonly ILog logger = LogManager.GetLogger(typeof(MainWindow));
public MainWindow()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += bw_DoWork;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
logger.Info("Complete");
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
logger.Info("Start");
Thread.Sleep(5000);
logger.Info("End");
}
}
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Height="30" Click="Button_Click_1">Start</Button>
<local:LogAppender Grid.Row="1" Grid.ColumnSpan="2"/>
</Grid>
DoAppend メソッドによって生成されるテキストに TextBlock をバインドするだけでなく、TextBlock の Text プロパティを設定するだけで無駄にしようとしました。
小さいながらも大きなポイントがいくつか欠けていると確信していますが、今日の午後、約 3 時間頭をかきむしりましたが、役に立ちませんでした。
どんな助けでも大歓迎です!!
ありがとうブライアン