我正在尝试创建一个窗体,在事件触发时显示2秒钟,然后自动关闭。
我尝试了几种选择。这是我目前的代码:
this.aletPopup.StartPosition = FormStartPosition.CenterScreen;
this.aletPopup.Show();
Thread.Sleep(2000);
this.aletPopup.Close();
这会预先形成我想要的动作,但是,当表单加载时,它不会加载表单上的标签或图像。相反,图像和标签变得透明的区域。我想要的输出是这样的:
我也尝试使用显示图形的this.aletPopup.ShowDialog();
。但是,使用此方法时,表单不会自动关闭。
编辑:我正在尝试使用 Michael Perrenoud的解决方案。但是,我无法让表格结束。我有一个设置为2000毫秒间隔的计时器,它被初始禁用。我是否正确地覆盖了OnShown?
public AlertPopForm()
{
InitializeComponent();
}
private void closingTimer_Tick(object sender, EventArgs e)
{
closingTimer.Enabled = false;
this.Close();
}
private void AlertPopForm_OnShown(object sender, System.EventArgs e)
{
closingTimer.Enabled = true;
closingTimer.Start();
}
答案 0 :(得分:6)
相反,如何利用ShowDialog
,然后在对话框表单上使用Timer
。在Tick
的{{1}}事件中,关闭表单。
Timer
如果您想要一些灵活性,甚至可以将间隔传递到对话框表单的this.aletPopup.StartPosition = FormStartPosition.CenterScreen;
this.aletPopup.ShowDialog();
。
这里需要注意的是,您需要利用OnShown
覆盖实际.ctor
Start
,以便实际向用户显示该表单。
答案 1 :(得分:1)
原因可能在Message Loop中。当你通过Thread.Sleep阻塞你的线程时,它也会阻止消息循环。
你可以这样做:
this.aletPopup.StartPosition = FormStartPosition.CenterScreen;
this.aletPopup.Show();
for(var i = 0; i<= 200; i++)
{
Thread.Sleep(10);
Application.DoEvents();
}
this.aletPopup.Close();
DoEvents将在此期间处理来自消息队列的消息。
答案 2 :(得分:1)
调用Thread.Sleep
时,您正在阻止UI线程,从而阻止它处理UI事件。
您需要确保在2秒后调用Close
而不实际阻止主线程。有多种方法可以执行此操作,例如使用Timer
或类似Task.Delay
的内容:
aletPopup.StartPosition = FormStartPosition.CenterScreen;
aletPopup.Show();
Task.Delay(TimeSpan.FromSeconds(2))
.ContinueWith(t => aletPopup.Close(),
TaskScheduler.FromCurrentSynchronizationContext());
答案 3 :(得分:0)
发生这种情况的原因是,您正在暂停绘制表单的线程。因此表单有时间显示,但正在绘制时,线程正在停止。
很容易修复......
使用以下处理程序为Load
事件的弹出窗口添加事件处理程序:
private async void handleLoad(Object sender, EventArgs args)
{
await Task.Delay(2000);
Close();
}
<强>备注强>
因为您使用了Show()
,所以用户可以随时点击此弹出窗口。如果这是不合需要的,请改用ShowDialog()
。
答案 4 :(得分:-1)
您是否尝试刷新以重绘表单?
this.aletPopup.StartPosition = FormStartPosition.CenterScreen;
this.aletPopup.Show();
this.alertPopup.Refresh();
Thread.Sleep(2000);
this.aletPopup.Close();