我是c#的新手,我使用的是Windows窗体。
我form1
有3 buttons
。我正在尝试设置3个按钮,以便在表单加载时/之后逐个显示。我使用了下面的代码,但是当我运行程序同时出现3个按钮时它不起作用
private void MainForm_Load(object sender, EventArgs e)
{ //Hide all buttons
button1.Visible = false;
button2.Visible = false;
button3.Visible = false;
Thread.Sleep(500);
//show buttons one by one
button1.Visible = true;
Thread.Sleep(500);
button2.Visible = true;
Thread.Sleep(500);
button3.Visible = true;
}
我不知道我做错了什么。任何人都可以帮助我如何在表单加载时/之后逐个显示3个按钮。我很高兴收到任何其他想法。谢谢
答案 0 :(得分:6)
您正在使用Thread.Sleep阻止UI线程,并且没有反映更新。
您可以做的最好的事情是创建一个异步函数并使用Task.Delay,这样线程仍然会响应,您将看到更新:
42h
答案 1 :(得分:4)
这里的主要问题是在呈现表单之前调用Load。这与Thread.Sleep阻塞当前(UI)线程的事实相结合,导致在窗体实际呈现之前所有按钮都可见。
您可以使用temp.txt
事件并使暂停异步来解决此问题。
Form.Shown
确保按钮仍然以private async void Shown(Object sender, EventArgs e) {
var buttons = new[] {button1, button2, button3};
foreach (var button in buttons)
{
await Task.Delay(TimeSpan.FromMilliseconds(500));
button.Visible = true;
}
}
答案 2 :(得分:1)
在Form_Load事件中将所有按钮的Visible设置为False。
创建一个具有所需间隔和一些计数器的计时器。
在Timer.Tick事件中,根据计数器值逐个设置按钮的可见性,如下所示:
switch(counter)
{
case 0: button1.Visible = true; break;
case 1: button2.Visible = true; break;
case 2: button3.Visible = true; break;
}
counter++;
然后,当所有按钮都可见时,请禁用计时器。
答案 3 :(得分:0)
button1.Visible = false;
button2.Visible = false;
Task.Factory.StartNew(() =>
{
Thread.Sleep(2000);
this.Invoke((MethodInvoker)delegate { button1.Visible = true; });
Thread.Sleep(2000);
this.Invoke((MethodInvoker)delegate { button2.Visible = true; });
});