如何在启用控件之前等待

时间:2013-10-09 00:28:05

标签: c# windows-phone-7 windows-phone-8

我的欢迎页面中有一个按钮,但我想等待大约3秒才允许用户按下它。这样就迫使用户阅读快速的小信息声明。我在xaml中默认禁用该按钮,然后在我加载的事件中我想启动计时器,当3秒过去时启用按钮。从这里引用上一个问题How to Pause without Blocking the UI我有以下内容,但在尝试启用按钮时我得到UnauthorizedAccessException

WelcomePage.xaml

<Button x:Name="welcomeButton" IsEnabled="False" Content="Welcome" Click="welcomeButton_Click"/>

WelcomePage.xaml.cs

void WelcomePage_Loaded(object sender, RoutedEventArgs e)
{
    Task.Delay(TimeSpan.FromSeconds(3.0)).ContinueWith(t =>
        {
            welcomeButton.IsEnabled = true; //UnauthorizedAccessException error
        });
}

有更好的方法吗?所有用户在此页面上正在阅读快速语句,因此是否有必要阻止UI线程?在这种情况下的任何建议或建议将不胜感激。

2 个答案:

答案 0 :(得分:3)

您需要将上下文封送回UI线程:

Task.Delay(TimeSpan.FromSeconds(3.0)).ContinueWith(t =>
    {
        welcomeButton.IsEnabled = true;
    }, TaskScheduler.FromCurrentSynchronizationContext());

请注意,在Windows Phone 8中,您可以使用async / await。这也可以通过Microsoft.Bcl.Async包在7.5中使用:

async void WelcomePage_Loaded(object sender, RoutedEventArgs e)
{
    await Task.Delay(TimeSpan.FromSeconds(3.0));
    welcomeButton.IsEnabled = true;
}

答案 1 :(得分:2)

正如Reed在Windows Phone 8中所说,这种方法将会,

async void WelcomePage_Loaded(object sender, RoutedEventArgs e)
{
     await Task.Delay(TimeSpan.FromSeconds(3.0));
     welcomeButton.IsEnabled = true;
}

解决您的问题。

要了解有关此async / await的更多信息,您可以使用此功能 MSDN Link