我发现了一种非常简单而优雅的方法,可以通过此link将控制台输出定向到文本框,但是现在我找不到在presenter类中实现它的方法,因此该方法可以在我需要的任何地方使用。这意味着在主线程中,而且在主线程中初始化的所有类中也是如此。
问题是,我在网上找到的类中包含一个将输出定向到的控件(文本框)。在我的主持人班上,我无法定义控件。因此,当我启动演示者线程,然后启动定义了TextWriter的表单时,在表单中生成的输出将按预期方式写入文本框,但是无论何时我在演示者中使用Console.Writeline或在脚本中创建的其他实例中演示者,那么它仍将定向到标准调试输出窗口...
您可能已经看到,我对MVC模型比较陌生。 :)
因此,TextBoxStreamWriter:
public class TextBoxStreamWriter : TextWriter
{
TextBox _output ;
public TextBoxStreamWriter(TextBox output)
{
_output = output;
}
public override void Write(char value)
{
MethodInvoker action =
delegate
{
_output.AppendText(value.ToString());
};
_output.BeginInvoke(action);
}
public override Encoding Encoding
{
get { return System.Text.Encoding.UTF8; }
}
}
在我的主持人班上:
public MTMainPresenter(IMTMainForm view)
{
_view = view;
HandleShizzle();
Console.Writeline("Presenter initialized :( "); // << Doesn't work as I want it to...
}
program.cs:
private static MTMainPresenter _presenter;
static void Main()
{
var mainForm = new MTMainForm();
_presenter = new MTMainPresenter(mainForm);
Application.Run(mainForm);
}
以我的形式:
TextWriter _writer = null;
private void Form1_Load(object sender, EventArgs e)
{
_writer = new TextBoxStreamWriter(txtboxConsole);
Console.SetOut(_writer);
Console.Writeline("Yay !"); // << Works fine, the way I want it to
}
因此,基本上,我以生成Console.WriteLine()的形式创建了一个测试按钮,这很好用。但是,当我在演示者中执行相同操作时,它将写入标准调试窗口。我已经尝试过在Procgram.cs类中初始化TextWriter,但是由于它具有TextBox控件,需要分配该控件,因此我对如何解决此问题有些迷惑...
我很确定这很容易解决,但我缺乏经验。
非常感谢P
我明白了。在考虑了一段时间并尝试了一些方法之后,我找到了一种方法。可能会有更好的方法,所以如果这不是按照最佳做法进行的,请更正我。 :)但是有效...
我现在可以在任何地方调用Console.WriteLine()(MTMainForm,Presenter,演示者内部的任何自定义对象实例...)。>>
我正在采取的步骤...1.创建表格2.在窗体中,创建链接到控件的编写器3.返回Program.cs,从表单获取创建的编写器4.将输出偏离到编写器5.运行表格...
Program.cs
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var mainForm = new MTMainForm(); TextWriter wrt = mainForm.GetWriter(); Console.SetOut(wrt); _presenter = new MTMainPresenter(mainForm); Application.Run(mainForm); }
MTMainForm:
TextBoxStreamWriter _writer = null; public MTMainForm() { InitializeComponent(); _writer = new TextBoxStreamWriter(textBoxConsole); } public TextBoxStreamWriter GetWriter() { return _writer; }
TextBoxStreamWriter:
public class TextBoxStreamWriter : TextWriter
{
TextBox _output;
public TextBoxStreamWriter(TextBox output)
{
_output = output;
}
public override void Write(char value)
{
MethodInvoker action =
delegate
{
_output.AppendText(value.ToString());
if (_output.Text.Length > 4000)
_output.Text = _output.Text.Substring(2000, _output.Text.Length - 2000);
};
_output.BeginInvoke(action);
}
public override Encoding Encoding
{
get { return System.Text.Encoding.UTF8; }
}
}