C#的WinForms子窗体显示()后没有得到重绘
问题描述:
我工作的一个C#WinForms应用程序,我希望它能够流行开一个无模式对话框这将让重绘,并在同一时间,是互动主窗口/窗体。C#的WinForms子窗体显示()后没有得到重绘
主窗口使用的SerialPort和显示数据传送计数,它们经由SerialDataReceivedEventHandler不断增加。
我可以使用ShowDialog(),它似乎以模态方式工作,但主窗口数据计数器冻结,而对话框正在使用,我认为最终串行缓冲区溢出。我想我想使用Show(),但是如果我这样做,对话框会出现在屏幕上半绘制,然后不再绘制或交互(如果我拖动另一个窗口跨过它)将不会被绘制或交互。它保持在屏幕上,直到我关闭主应用程序窗口。
也许我应该开始另一个线程,或者有可能的,我只是做了什么。我通常不会做C#或Windows程序设计(也许你可以告诉。)评论(感谢,评论)后
编辑:
我想,也许大多数事情越来越下任何线程串行接收事件处理器运行被调用。当启动我的应用程序创建一个类来处理串行端口,其中包括:
com.DataReceived += new SerialDataReceivedEventHandler(SerialRxHandler);
我写了关心线程的唯一的代码是一些功能更新计数器和日志列表框,我发现了与一些InvokeRequired包裹阻止我获取有关线程切换的抱怨:
delegate void SetCountDelegate(TextBox tb, int count);
internal void SetCount(TextBox tb, int count) {
// thread switch magic
if (InvokeRequired) {
BeginInvoke(new SetCountDelegate(SetCount), new object[] { tb, count });
} else {
tb.Text = String.Format("{0}", count);
}
}
所以也许我不应该试图表明()在此线程的形式。另一个InvokeRequired块,还是我应该做的事情完全不同?
答
想我会回答自己..
通过评议和一点思维的推动下,我做了一个Invoke()切换到UI线程试图创建和显示()我的孩子对话框之前。这工作。
可以请您发布您的代码。你是从UI线程上的串行端口读取? – 2011-01-11 07:41:04