【WPF】テキストブロックにコンソールログを出力する

Uncategorized
220 words

C# の Console.WriteLine をした時に、テキストブロックに出力させる方法です。

手順

TextBlock コントロールを追加

MainWindow.xaml ファイルを開き、Window 要素内に TextBlock コントロールを追加します。

1
2
3
4
5
6
7
8
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBlock x:Name="outputTextBlock" />
</Grid>
</Window>

ControlWriter クラスを作成

ControlWriter クラスは、System.IO.TextWriter クラスを継承し、Write メソッドをオーバーライドして TextBlock コントロールに出力します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace WpfApp1
{
public class ControlWriter : System.IO.TextWriter
{
private readonly System.Windows.Controls.TextBlock _output;

public ControlWriter(System.Windows.Controls.TextBlock output)
{
_output = output;
}

public override void Write(char value)
{
_output.Dispatcher.Invoke(() => _output.Text += value);
}

public override System.Text.Encoding Encoding => System.Text.Encoding.UTF8;
}
}

TextBlock コントロールを出力先に設定

MainWindow.xaml.cs ファイルを開き、以下のコードを追加して、コンソール出力を TextBlock コントロールに表示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using ConsoleApp1;
using System;
using System.Windows;

namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

// コンソール出力を TextBlock に表示する
Console.SetOut(new ControlWriter(outputTextBlock));
}
}
}

確認

Console.WriteLine をすると、TextBlock コントロールにログが出力されるようになります。