我正在尝试创建一个"调试窗口"或"输出窗口"使用Windows窗体,所以如果用户输入中有一些错误,我可以在这个"输出窗口",代码和下面的问题中显示错误:
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());
它会将文本写入listBox,但如果我使用" .Show()"调试窗口打开,但它冻结了,我不能关闭/移动/等,如果我使用" .ShowDialog()"它不会冻结,但它会将i设置为20并仅在我关闭"调试窗口时再次打印它#34;形式。
有一个解决方案吗?因为我尝试了所有东西,在一个线程中运行它,创建一个新的立场等等,但是probem仍然存在,因为我希望将来保留listBox项目" Debug.Write ..."调用,我每次调用它时都不想要一个空白的listBox(如果使用新的DebugWindow())。
谢谢。
答案 0 :(得分:0)
我建议你看看servys的回答:
Run two winform windows simultaneously
这里的msdn文章:
https://msdn.microsoft.com/en-us/library/system.windows.forms.application.applicationexit.aspx
我不确定你是如何阻止UI线程但是你可以看到在没有单独线程的情况下同时显示两个表单是可能的,所以也许你在" on show&#中做了些什么34;调试表单的事件?
你打电话多少次"写入调试窗口"?我会将您的调试编写到一个单独的列表中,并有一个"更新调试表单"而是在函数结束时运行。
你甚至可以使用某种范围逻辑(使用临时日志记录类,当它超出范围时更新表单及其内容)
答案 1 :(得分:-1)
编辑:找到解决方案:
为ShowDialog()
创建一个Threadpublic void OpenWindow()
{
if (debugWindow.Visible)
debugWindow.SafeBringToFront();
else
new Thread(() => debugWindow.ShowDialog()).Start();
}
第二种形式的SafeBringToFront():
public void SafeBringToFront()
{
this.Invoke(new MethodInvoker(delegate() { this.BringToFront(); }));
}
谢谢大家!