Перенаправление вывода на консоль в winforms ListBox
Я построил библиотеку, которая выводит большую часть своего текста отладки, используя Console.WriteLine();
Сейчас я нахожусь в процессе использования библиотеки в приложении Windows Forms, и мне по-прежнему нужен доступ к выходным данным консоли. (Для отображения в окне списка /RichText)
Я заметил, что я могу переопределить стандарт из консоли на 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 ответа
Другой, возможно, более чистый способ сделать это - расширить 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; }
}
}
Вместо того, чтобы пытаться "захватить" текст, отправленный на консоль, я бы создал новый класс, который обрабатывает написание вывода для вас. Затем этот новый класс может записывать в консоль, а также в любое другое место, куда вы хотите, чтобы он шел.
Если вы используете класс.NET Debug, просто используйте два прослушивателя: ConsoleTraceListener и TextWriterTraceListener.
Чтобы ваш существующий код работал, добавьте:
writer.Flush();
после вызова Console.WriteLine().