Привязать вывод консоли к RichEdit - PullRequest
3 голосов
/ 19 сентября 2010

Так что довольно простой вопрос. У меня есть c # .dll с большим количеством кода Console.Writeline, и я хотел бы иметь возможность просматривать этот вывод в приложении форм, используя этот .dll. Существует ли относительно простой способ привязки вывода консоли к RichEdit (или другому подходящему элементу управления)? В качестве альтернативы, можно ли встроить консольную оболочку в форму? Я нашел несколько похожих вопросов, но в большинстве случаев люди хотели иметь возможность получать консольный ввод, который мне не нужен.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 19 сентября 2010

Вы можете использовать Console.SetOut () для перенаправления вывода. Вот пример формы, которая демонстрирует подход. Удалите RichTextBox и кнопку на форме.

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        button1.Click += button1_Click;
        Console.SetOut(new MyLogger(richTextBox1));
    }
    class MyLogger : System.IO.TextWriter {
        private RichTextBox rtb;
        public MyLogger(RichTextBox rtb) { this.rtb = rtb; }
        public override Encoding Encoding { get { return null; } }
        public override void Write(char value) {
            if (value != '\r') rtb.AppendText(new string(value, 1));
        }
    }
    private void button1_Click(object sender, EventArgs e) {
        Console.WriteLine(DateTime.Now);
    }
}

Я предполагаю, что это будет не очень быстро, но выглядело нормально, когда я попробовал. Вы можете оптимизировать, переопределив больше методов.

3 голосов
/ 19 сентября 2010

IMO, было бы лучше провести рефакторинг существующего кода, заменив существующий Console.WriteLine на какой-то центральный метод в вашем коде, а затем переписать этот метод, предположительно, предоставив другой TextWriter:

private static TextWriter output = Console.Out;
public static TextWriter Output {
   get {return output;}
   set {output = value ?? Console.Out;}
}
public static void WriteLine(string value) {
    output.WriteLine(value);
}
public static void WriteLine(string format, params string[] args) {
    output.WriteLine(format, args);
}

Или (проще и менее хакерски в отношении статического поля), просто введите TextWriter в существующий код и напишите в него?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...