Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UI更新未按预期顺序进行_C#_.net_Winforms - Fatal编程技术网

C# UI更新未按预期顺序进行

C# UI更新未按预期顺序进行,c#,.net,winforms,C#,.net,Winforms,我有一个面板,它在网格布局中承载许多子控件。每个子控件都由一个带有PictureBox和标签的面板组成。当单击其中一个子控件时,它将被选中,这基本上需要将其背景更改为不同的颜色,并触发事件。在该事件的处理程序中,图像以单独的形式显示在PictureBox中 在代码中,在触发事件之前,子控件的背景肯定会更改,但由于某些原因,它在运行时不会更新,直到图像以另一种形式更新之后。我试图在触发事件之前使子控件无效并刷新它,但没有效果 为什么会发生这种情况,我该怎么做才能将其设置正确?如果我没记错,与事件关

我有一个面板,它在网格布局中承载许多子控件。每个子控件都由一个带有PictureBox和标签的面板组成。当单击其中一个子控件时,它将被选中,这基本上需要将其背景更改为不同的颜色,并触发事件。在该事件的处理程序中,图像以单独的形式显示在PictureBox中

在代码中,在触发事件之前,子控件的背景肯定会更改,但由于某些原因,它在运行时不会更新,直到图像以另一种形式更新之后。我试图在触发事件之前使子控件无效并刷新它,但没有效果


为什么会发生这种情况,我该怎么做才能将其设置正确?

如果我没记错,与事件关联的方法将在引发事件的同一线程中执行,因此UI线程将被阻止以单独的形式执行图片更改。作为解决方案,使用额外的线程(例如通过线程池)来执行事件。这样,代码将继续,用户界面可以重新绘制。

请尝试以下操作:更改背景颜色后,执行Application.DoEvents;然后为另一种形式触发事件。

为了简洁起见,我进行了简化,但实际上我是在一个单独的线程上执行事件处理程序。当然,PictureBox更新必须在UI线程上进行,但不知怎么的,它仍然设法挂断。我接受了这个答案,因为事实证明,我并不总是在单独的线程上处理事件。一旦我明白了这一点,它就开始按预期运行-1对于我来说,简单的愚蠢:\n别担心,我们都会时不时地遇到这个问题,它会发生。如果刷新不起作用,那么我不希望DoEvents做得更好。请看这个问题: