2015-01-26 39 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線程,但你可以看到在沒有單獨線程的情況下同時顯示兩種形式是可能的,所以也許它是你在調試表單的「顯示」事件中做的事情?

調用「寫入調試窗口」多少次?我會將您的調試寫入一個單獨的列表,並在該函數的末尾運行「更新調試表單」。

你甚至可以幻想和使用某種範圍的邏輯(使用一個臨時日誌類,當它超出範圍更新的形式與內容)