[英]Creating an output form C#
我正在尝试使用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());
它将文本写入列表框,但是如果我使用“ .Show()”打开调试窗口,但是它冻结了,我无法关闭/移动/等,如果我使用“ .ShowDialog()”,它不会冻结,但它将i设置为20并仅在我关闭“调试窗口”表格时再次打印。
有解决方案吗? 因为我尝试了所有操作,在线程中运行它,创建了新的姿态等,但是探针仍然存在,因为我想在以后的“ Debug.Write ...”调用中保留listBox项,所以我每次都不需要空白的listBox我称它(在使用新的DebugWindow()的情况下)。
谢谢。
我建议您在这里查看servys答案:
此处的msdn文章:
https://msdn.microsoft.com/zh-CN/library/system.windows.forms.application.applicationexit.aspx
我不太确定您是如何阻塞UI线程的,但是您可以看到在没有单独线程的情况下同时显示两个表单是可能的,所以也许是您在调试表单的“显示”事件中所做的事情?
您多次调用“写入调试窗口”? 我会将您的调试信息写到一个单独的列表中,然后在函数末尾运行一个“更新调试表单”。
您甚至可能会幻想并使用某种范围逻辑(使用临时记录类,该类在超出范围时会使用其内容更新表单)
编辑:找到解决方案:
创建一个到ShowDialog()的线程
public void OpenWindow()
{
if (debugWindow.Visible)
debugWindow.SafeBringToFront();
else
new Thread(() => debugWindow.ShowDialog()).Start();
}
第二种形式的SafeBringToFront():
public void SafeBringToFront()
{
this.Invoke(new MethodInvoker(delegate() { this.BringToFront(); }));
}
感谢大家!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.