如何在WPF中延迟关闭窗口

时间:2011-03-24 21:31:48

标签: wpf timer window threadpool

我尝试延迟关闭App.xaml.ca中的窗口:

Window splash = new Window();
splash.Show();

Timer timer = new Timer(callback, null, 2000, Timeout.Infinite);

private void callback(object stateInfo)
{
  splash.Close();
}

它工作正常,但整个应用程序正在关闭。这里有什么问题?

3 个答案:

答案 0 :(得分:1)

请务必检查主调度程序线程上是否有计时器回调。如果没有,那么当您尝试从不同的线程关闭窗口时,您可能会遇到异常。

使用splash.Dispatcher.CheckAccess()确保您在正确的线程上,如果没有,则使用splash.Dispatcher.BeginInvoke((Action) () => splash.Close()将调用分派到主线程。

查看this page了解更多

答案 1 :(得分:0)

有不同的关闭模式,如果该窗口关闭且它是最后一个,则默认情况下应用程序将关闭。所以你可以看到它还有一些窗口,或者你可以通过将ShutdownMode设置为适合你需要的东西来改变关闭行为。

e.g。

Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;

答案 2 :(得分:0)

这是我对这个完全相同的问题的解决方案:

 private async void CloseWindow()
 {
    await ClosingTasks();
 }

 private async Task ClosingTasks()
 {            
    await Task.Delay(2000);            
    this.Close();
 }

如果要在给定的2000 mS延迟后关闭当前窗口,只需调用CloseWindow()即可。