这是我在Form中的一个类中的方法。我在我的按钮上使用自定义图像背景,我想更改它们以使它们看起来像动画:
private void restaurantButton_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(75);
restaurantButton.BackgroundImage = Properties.Resources.buttonBackClicked;
System.Threading.Thread.Sleep(150);
restaurantButton.BackgroundImage = Properties.Resources.buttonBack;
}
如果我进行一次更改,动画就会发生。上面的代码似乎没有做任何事情。请帮助,如果可以的话,建议另一种方法在VC#(VS2013)中手动设置控件(即控制图像,点击时间等)。
答案 0 :(得分:2)
你正在UI线程上睡觉,阻止了UI的更新。
相反,请使用await Task.Delay()
进行非阻塞等待。
答案 1 :(得分:2)
问题是您阻止了UI线程并且不允许它更新。您只在这里使用一个线程,同一个线程恰好是对UI进行可视更新的线程。因此,如果您将线程置于睡眠状态,即更新您的UI,它将不会更新(因为它已经睡着了)。
要解决此问题,您需要异步等待单独的线程。在.Net 4.5中引入的async / await关键字将使这非常容易,请参阅下面的代码:
private async void restaurantButton_Click(object sender, EventArgs e)
{
await Task.Delay(75);
restaurantButton.BackgroundImage = Properties.Resources.buttonBackClicked;
await Task.Delay(150);
restaurantButton.BackgroundImage = Properties.Resources.buttonBack;
}
当你调用await时,实际发生的是当前线程被释放(释放)并且Task.Delay
正在另一个线程上执行。当第二个线程完成时(在这种情况下等待),它会向主线程发出信号以继续。