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块,还是我应该做的事情完全不同?

+0

可以请您发布您的代码。你是从UI线程上的串行端口读取? – 2011-01-11 07:41:04

想我会回答自己..

通过评议和一点思维的推动下,我做了一个Invoke()切换到UI线程试图创建和显示()我的孩子对话框之前。这工作。