【问题标题】:C# WinForms child form not getting redrawn after Show()C# WinForms 子窗体在 Show() 之后没有被重绘
【发布时间】:2011-01-11 07:35:35
【问题描述】:

我正在开发一个 C# WinForms 应用程序,我希望它能够弹出一个非模态对话框,该对话框将被重绘并与主窗口/窗体同时进行交互。

主窗口正在使用 SerialPort 并显示通过 SerialDataReceivedEventHandler 不断增加的数据传输计数。

我可以使用似乎以模态方式工作的 ShowDialog(),但是在使用对话框时主窗口数据计数器会冻结,我认为最终串行缓冲区会溢出。

我想我想使用 Show(),但是如果我这样做,对话框会出现在屏幕上半画,然后不再绘制或交互(如果我在它上面拖动另一个窗口,则会被丢弃)。在我关闭主应用程序窗口之前,它会一直显示在屏幕上。

也许我应该开始另一个线程,或者可能只是做错了什么。我通常不做 C# 或 Windows 编程(也许你能看出来。)

在 cmets 之后编辑(感谢评论者):

我认为也许大多数事情都在调用串行接收事件处理程序的任何线程下运行。在启动我的应用程序时,我创建了一个类来处理序列号,其中包括:

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);
    }
}

所以也许我不应该在这个线程上尝试 Show() 一个表单。另一个 InvokeRequired 块,还是我应该做完全不同的事情?

【问题讨论】:

  • 能否请您发布您的代码。您是从 UI 线程上的串行端口读取数据吗?
  • 您需要使用Show 而不是ShowDialog 是对的,但您可能不应该尝试从多个线程更新用户界面。您能否发布您的代码,以便我们查看导致您的应用程序冻结的原因?您可能需要将串行端口访问关闭到单独的线程上。

标签: c# .net winforms


【解决方案1】:

假设我会回答自己..

在评论者的提示和一些思考下,我在尝试创建和 Show() 我的子对话框之前执行了 Invoke() 以切换到 UI 线程。那行得通。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多