图像框不响应可见的true
本文关键字:true 不响应 图像 | 更新日期: 2023-09-27 18:04:00
嗨,我正在做一个小实验,通过在你按下按钮后显示一个延迟200毫秒的白色圆圈来欺骗大脑,然后在3分钟后按住按钮它显示没有延迟,但我的图像框将不会响应visible=true
public void CircleDelay()
{
Thread.Sleep(200);
imgCircle.Visible = true;
Thread.Sleep(150);
imgCircle.Visible = false;
}
public void CircleNonDelay()
{
imgCircle.Visible = true;
Thread.Sleep(150);
imgCircle.Visible = false;
}
private void button1_Click(object sender, EventArgs e)
{
button1.Text = @"Click!";
if(time == null)
{
time = DateTime.Now.ToString();
}
if (DateTime.Now < Convert.ToDateTime(time).AddMinutes(3))
{
//
CircleDelay();
}
else
{
//
CircleNonDelay();
}
}
问题是在方法CircleDelay()
和CircleNonDelay()
, UI线程没有得到任何时间来更新UI和显示图像。一旦它有机会,将图像可见性设置为false
的代码已经执行,这就是为什么您看不到图像。
考虑以下代码
public void CircleNonDelay()
{
//UI thread sets the visibility to true
imgCircle.Visible = true;
//then UI thread sleeps for 150 ms (note the UI thread haven't updated the UI yet because it will do that once it is free from tasks assigned to it)
Thread.Sleep(150);
//UI thread sets visibility to false again
imgCircle.Visible = false;
}
因此,一旦UI线程获得自由,您已经将可见性设置为false
,其他方法
你应该怎么做
public void CircleNonDelay()
{
imgCircle.Visible = true;
// start a background worker or timer which will raise an event after 150 ms
//and call imgCircle.Visible = false; inside that event
}
Windows窗体只在UI线程空闲时绘制到屏幕上-即当它不在您的事件处理程序之一中时。通过执行Thread.Sleep(),你不会给UI一个重新绘制的机会。
如果你调用Update(),你会看到变化,或者调用Application.DoEvents()来放弃控制,让屏幕重新绘制。
实际上,你在UI线程上调用thread . sleep()所做的是锁定UI,因此它不会更新或响应用户。您应该使用Timer来显示或隐藏图片框,以便UI响应()。