Button.Visible = true; 在功能中激活时,无法将按钮设置为可见

blu*_*lue 3 c# winforms

我无法找到其他人遇到同样的问题,所以希望有人可能有一些想法或者能够指出我另一个答案.

通过按下窗体上的按钮运行功能时,另一个按钮应该可见.但是,按钮永远不会显示,即使它是函数中的第一件事.该函数中的所有其他代码都可以正常工作.

这是代码:

private void trackbar_Change(object sender, EventArgs e)
{
    button.Visible = true;
    progressbar.Visible = true;

    ...

    progressbar.Visible = false;
    button.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)

进度条显示并正常工作,函数中的所有其他代码也可以正常工作,但按钮永远不会显示.

如果我button.Visible = false;从函数的末尾删除,则按钮显示,但仅在所有其他代码执行之后.像这样:

private void trackbar_Change(object sender, EventArgs e)
{
    button.Visible = true;
    progressbar.Visible = true;

    ...

    progressbar.Visible = false;
    //button.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)

注释掉该行会导致按钮显示.现在如果我在按钮行后面添加一个消息框,那么它也可以工作.

private void trackbar_Change(object sender, EventArgs e)
{
    button.Visible = true;
    MessageBox.Show("Button should be visible now");
    progressbar.Visible = true;

    ...

    progressbar.Visible = false;
    button.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)

按钮行后添加消息框导致按钮在正确的时间显示.

有没有人有任何想法为什么这个按钮的行为方式?

Phi*_*rie 8

听起来像GUI线程很忙.尝试通过调用Application.DoEvents()来强制屏幕更新,例如:

button.Visible = true;
progressbar.Visible = true;
Application.DoEvents();
Run Code Online (Sandbox Code Playgroud)

DoEvents() 将强制处理消息队列中的所有消息.

一个更好的解决方案将是移动主UI线程的长时间运行的线程.使用BackgroundWorker完成任务.

它将使整个表单更具响应性.例如,您将能够与表单进行交互,并且它不会变为"白色".实现BackgroundWorker很简单,对于主UI线程上的长时间运行进程是必须的,

  • @PhilipFourie谢谢,BackgroundWorker解决了比我知道的更多的问题.现在进度条也可以更好地工作. (2认同)