2015-01-26 72 views
0

我想创建一个“调试窗口”或“输出窗口”使用Windows窗体,所以如果在用户输入中有一些错误,我可以在这个“输出窗口”显示错误,代码和下面的问题:创建一个输出窗体C#

public partial class DebugWindow : Form 
    { 
     public DebugWindow() 
     { 
      InitializeComponent(); 
     } 

     public void WriteDebugWindow(string text) 
     { 
      DateTime dt = DateTime.Now; 
      text = dt.ToString("[yyyy-MM-dd HH:mm:ss] ") + text; 
      listBox1.Items.Add(text); 
     } 
    } 

和类

public class Debug 
    { 
     DebugWindow debugWindow; 

     public Debug() { debugWindow = new DebugWindow(); } 

     public void WriteDebugWindow(string text) 
     { 
      this.debugWindow.WriteDebugWindow(text); 
      OpenWindow(); 
     } 

     public void OpenWindow() 
     { 
      if (debugWindow.Visible) 
       debugWindow.BringToFront(); 
      else 
       debugWindow.Show(); //Problem here 
     } 
    } 

所以,如果我尝试运行像代码:

int i = 10; 
Debug.WriteDebugWindow(i.ToString()); 
i = 20; 
Debug.WriteDebugWindow(i.ToString()); 

它会将文本写入列表框,但如果我使用“.Show()”调试窗口打开,但它冻结,我不能关闭/移动/等,如果我使用“.ShowDialog()”它不冻结,但它会将i设置为20,并且只有在关闭“调试窗口”窗体时才会再次打印。

有一个解决方案吗?因为我尝试了一切,在一个线程中运行它,创建一个新的姿态等等,但是probem仍然存在,因为我想在将来的“Debug.Write ...”调用中保留listBox项目,我不希望每次都有一个空白的listBox我称它(在使用新的DebugWindow()的情况下)。

谢谢。

+0

如果你想更新用户界面,你不需要屏蔽你的UI线程。如果您长时间运行非UI工作,请在非UI线程中执行此操作。 – Servy 2015-01-26 21:21:05

+0

我试图在WriteDebugWindow()方法中添加一个线程,但它打开并关闭第二个窗体(debugWindow) – Kyore 2015-01-27 12:21:56

+0

不要尝试创建第二个UI线程。这是一个可怕的想法,只会导致你在进一步的问题。而是停止在UI线程中执行非UI工作,并在非UI线程中执行非UI工作。让你的UI在非UI线程中工作,你的UI线程中的非UI工作只会引起头痛。 – Servy 2015-01-27 14:49:46

回答

-1

编辑:找到了解决办法:

public void SafeBringToFront() 
     { 
      this.Invoke(new MethodInvoker(delegate() { this.BringToFront(); })); 
     } 
0:在所述第二形式创建的线程对ShowDialog的()

public void OpenWindow() 
     { 
      if (debugWindow.Visible) 
       debugWindow.SafeBringToFront(); 
      else 
       new Thread(() => debugWindow.ShowDialog()).Start(); 
     } 

而SafeBringToFront()

谢谢大家!

+0

将您的回复标记为解决方案 – OhMyGeo 2015-01-28 09:19:38

+0

我会说,在我可以这样做之前等待X小时:)谢谢 – Kyore 2015-01-28 16:30:39

0

我建议你看一下servys回答这里:

Run two winform windows simultaneously

和MSDN文章在这里:

https://msdn.microsoft.com/en-us/library/system.windows.forms.application.applicationexit.aspx

我真的不知道你是如何阻塞UI线程,但你可以看到在没有单独线程的情况下同时显示两种形式是可能的,所以也许它是你在调试表单的“显示”事件中做的事情?

调用“写入调试窗口”多少次?我会将您的调试写入一个单独的列表,并在该函数的末尾运行“更新调试表单”。

你甚至可以幻想和使用某种范围的逻辑(使用一个临时日志类,当它超出范围更新的形式与内容)

相关问题