Wpf HowTo: Add a Debug/Output Console to your Application
This example shows how to make a multi-threaded handler for the built in Console commands.
You can set Console.Out to any TextWriter. So you simply have to create your own TextWriter to handle cross-threaded handling of messages to your user interface.
Below is an example of a writing Console messages to a TextBox from two different threads.
TextBoxOutputter.cs
using System;
using System.IO;
using System.Text;
using System.Windows.Controls;
namespace WpfApplication68
{
public class TextBoxOutputter : TextWriter
{
TextBox textBox = null;
public TextBoxOutputter(TextBox output)
{
textBox = output;
}
public override void Write(char value)
{
base.Write(value);
textBox.Dispatcher.BeginInvoke(new Action(() =>
{
textBox.AppendText(value.ToString());
}));
}
public override Encoding Encoding
{
get { return System.Text.Encoding.UTF8; }
}
}
}
Note: It's using the TextBox's Dispatcher to append the text. This prevents threading problems.
MainWindow.xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication68.MainWindow"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:WpfApplication68">
<Grid>
<TextBox Height="200" Width="400" x:Name="TestBox"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Windows;
using System.Threading;
namespace WpfApplication68
{
public partial class MainWindow : Window
{
TextBoxOutputter outputter;
public MainWindow()
{
InitializeComponent();
outputter = new TextBoxOutputter(TestBox);
Console.SetOut(outputter);
Console.WriteLine("Started");
var timer1 = new Timer(TimerTick, "Timer1", 0, 1000);
var timer2 = new Timer(TimerTick, "Timer2", 0, 500);
}
void TimerTick(object state)
{
var who = state as string;
Console.WriteLine(who);
}
}
}
This small article is part of a series of WPF "How To" articles, in response to real user questions on the MSDN WPF Forum.