3 回答
TA贡献1818条经验 获得超11个赞
这不起作用的原因是因为 Thread.Sleep() 正在阻止线程完成。
仅当应用程序不执行任何操作时,即在您的方法完成后,才会重绘窗口。如果您删除更改它的行,DarkGreen您将看到它在五秒钟后改变颜色。
您应该使用计时器来解决您的问题。
如果您愿意,您可以强制它提前刷新界面,而无需通过调用Application.DoEvents();将反映您所做的更改(例如颜色更改)离开该方法。
button1.BackColor = Color.Lime;
Application.DoEvents()
Thread.Sleep(5000);
button1.BackColor = Color.DarkGreen;
请注意,在具有用户界面的程序中放置线程睡眠是一个坏主意,但出于说明目的,它将向您展示如何使其改变颜色。
TA贡献1875条经验 获得超3个赞
您的问题是因为 UI 线程被阻止。您需要在单独的线程中运行此逻辑。试试这个代码:
private async void button1_Click(object sender, EventArgs e)
{
button1.BackColor = Color.LimeGreen;
await Task.Run(() =>
{
System.Threading.Thread.Sleep(5000);
button1.BackColor = Color.DarkGreen;
});
}
这会将您的按钮变为LimeGreen,然后等待 5 秒钟再将其变为DarkGreen。这是有效的,因为我们在一个新线程中旋转它,因此不会锁定 UI。
TA贡献1921条经验 获得超9个赞
我不推荐使用 Thread.Sleep() 因为它会冻结你的界面。您还需要刷新按钮以显示更改。您可以使用 async 和 wait 方法来延迟按钮颜色更改 在 button1_click 函数的 private 关键字之后添加 async 并创建 async Task 函数并使用 await awaiting() 删除 Thread.Sleep() 函数;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
button1.BackColor = Color.Lime;
button1.Refresh();
await awaiting();
button1.BackColor = Color.DarkGreen;
}
private async Task awaiting() {
await Task.Delay(5000);
}
}
- 3 回答
- 0 关注
- 98 浏览
添加回答
举报