Show()之后C#WinForms子窗体没有重绘

时间:2011-01-11 07:35:35

标签: c# .net 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块,或者我应该以完全不同的方式做事?

1 个答案:

答案 0 :(得分:0)

假设我会自己回答..

由评论者提示并进行了一些思考,在尝试创建和Show()我的子对话框之前,我做了一个Invoke()切换到UI线程。这很有用。