实现步骤
- 创建一个自定义
TextWriter
,用于将Debug.WriteLine
输出到TextBox
。 - 在 WPF 窗口中使用
TextWriter
,将其添加到Debug.Listeners
。 - 使用
Dispatcher.Invoke
确保 UI 线程安全地更新TextBox
完整代码
MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<Window x:Class="DebugToTextBox.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Debug Redirect" Height="350" Width="525"> <Grid> <TextBox x:Name="DebugTextBox" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextWrapping="Wrap" IsReadOnly="True"/> <Button Content="输出 Debug 信息" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="10" Padding="10" Click="Button_Click"/> </Grid> </Window> |
MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
using System; using System.Diagnostics; using System.IO; using System.Text; using System.Windows; using System.Windows.Threading; namespace DebugToTextBox { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 创建一个 TextBoxWriter,并重定向 Debug 输出 TextBoxWriter writer = new TextBoxWriter(DebugTextBox); Debug.Listeners.Add(new TextWriterTraceListener(writer)); } private void Button_Click(object sender, RoutedEventArgs e) { Debug.WriteLine($"[{DateTime.Now:T}] 这是一条调试信息"); } } public class TextBoxWriter : TextWriter { private readonly TextBox _textBox; public TextBoxWriter(TextBox textBox) { _textBox = textBox; } public override void Write(char value) { AppendText(value.ToString()); } public override void Write(string value) { AppendText(value); } private void AppendText(string text) { // 确保 UI 线程更新 _textBox.Dispatcher.Invoke(() => { _textBox.AppendText(text); _textBox.ScrollToEnd(); // 滚动到底部 }); } public override Encoding Encoding => Encoding.UTF8; } } |
为了优化代码结构,可以把TextBoxWriter类独立为一个.cs类文件。