在Visual Studio 2013上以可视方式模拟VC#中的按钮单击的方法:请告诉我出了什么问题

时间:2015-04-20 18:58:14

标签: c# user-interface visual-studio-2013

这是我在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)中手动设置控件(即控制图像,点击时间等)。

2 个答案:

答案 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正在另一个线程上执行。当第二个线程完成时(在这种情况下等待),它会向主线程发出信号以继续。