将控制台输出重定向到WinForms ListBox

5

我建立了一个库,使用Console.WriteLine();输出大部分的调试文本。

现在我正在将该库用于Windows Forms应用程序中,并且仍需要访问控制台输出。(以列表/富文本框形式显示)

我注意到我可以重写控制台的标准输出到TextWriter,但是如何将这些数据传输到显示器上呢?

我尝试着做一些类似下面的事情:

  public partial class Form1 : Form
  {
    Timer T;
    MemoryStream mem;
    StreamWriter writer; 


    public Form1()
    {

        InitializeComponent();
        mem = new MemoryStream(1000);
        writer = new StreamWriter(mem);
        Console.SetOut(writer);

        T = new Timer();
        T.Interval = 250; // yes this probally is to short.
        T.Tick += new EventHandler(T_Tick);
        T.Start();


        Console.WriteLine("output");
        Console.WriteLine("AnotherLine");
    }

    void T_Tick(object sender, EventArgs e)
    {
        string s = Encoding.Default.GetString(mem.ToArray());
        string[] Lines = s.Split(Environment.NewLine.ToCharArray());
        Output.Items.Clear(); // Output is a listbox 
        foreach (string str in Lines)
            Output.Items.Add(str);
    }
}

但是一切努力都没有效果。有什么想法吗?
已经删除了不必要的代码。
2个回答

12

另一种可能更清晰的方法是扩展TextWriter,使用自定义的方式记录到任何你想要的地方。

注意:我没有测试过这个方法。

public class ListBoxWriter : TextWriter
{
    private ListBox list;
    private StringBuilder content = new StringBuilder();

    public ListBoxWriter(ListBox list)
    {
        this.list = list;
    }

    public override void Write(char value)
    {
        base.Write(value);
        content.Append(value);
        if (value == '\n')
        {
            list.Items.Add(content.ToString());
            content = new StringBuilder();
        }
    }

    public override Encoding Encoding
    {
        get { return System.Text.Encoding.UTF8; }
    }
}

这正是我想要的:D 谢谢 - Fusspawn

3

与其试图“捕获”发送到控制台的文本,我建议创建一个新类来处理输出。然后,该新类可以写入控制台以及您想要它去的任何其他地方。

如果您正在使用.NET的Debug类,则只需使用两个侦听器:ConsoleTraceListener和TextWriterTraceListener。

为使现有代码工作,请添加:

writer.Flush();

在您的 Console.WriteLine() 调用之后。

如果我找不到解决方案,我很可能最终会采用那种方法。但我真的更愿意通过访问控制台输出来完成它(主要是为了方便使用),同时也作为一件教育性的事情。我相信将来我可以找到多种用途,因此现在学习如何做这件事将非常方便。 - Fusspawn
当我没有使用Debug类时(并非所有调试信息都不使用)。 我已经忘记了Debug类的存在,我可能会将一些位转换为使用它。 - Fusspawn
好的。在这种情况下,为了使您的代码正常工作,只需在您的Console.WriteLine()调用之后添加: writer.Flush(); - Andy West

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接