C#XAML - For循环只显示最后一次迭代,

时间:2017-04-18 02:59:33

标签: c# wpf visual-studio xaml for-loop

我目前正在使用VisualStudio(WPF应用程序)中的C#/ Xaml为我的第一个项目创建一个游戏。为了简化我的问题,我目前有一个按钮在一个窗口的位置显示一个随机图像(我布置了4个图像,所有折叠,然后这个代码将随机出现一个然后消失)。

而不是单击按钮,我想要一个for循环遍历代码并显示一个随机图像,等待一秒钟,然后让它消失并弹出另一个。我希望这会在一定的周期内自动发生。

我当前代码的一部分是:

private void Button_Click(object sender, RoutedEventArgs e)
{
    for (int j = 0; j < 5; j++)
    {
        Food1.Visibility = Visibility.Collapsed;
        Food2.Visibility = Visibility.Collapsed;
        Food3.Visibility = Visibility.Collapsed;
        Food4.Visibility = Visibility.Collapsed;

        int ImageToDisplay = RandomFood.Next(0, 4);

        if (ImageToDisplay == 0)
        {
            Food1.Visibility = Visibility.Visible;
        }
        else if (ImageToDisplay == 1)
        {
            Food2.Visibility = Visibility.Visible;
        }
        else if (ImageToDisplay == 2)
        {
            Food3.Visibility = Visibility.Visible;
        }
        else if (ImageToDisplay == 3)
        {
            Food4.Visibility = Visibility.Visible;
        }

        Thread.Sleep(1000);
    }
}

当我执行我的代码时,它会冻结5秒钟,窗口为空白,然后仅在5秒后显示最后一张图像。如何让它显示不同的图像,然后每秒消失5秒钟?

1 个答案:

答案 0 :(得分:1)

你正在让UI线程进入休眠状态。您需要使用async/await来处理此问题。这是一个选项:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    for (int j = 0; j < 5; j++)
    {
        Food1.Visibility = Visibility.Collapsed;
        Food2.Visibility = Visibility.Collapsed;
        Food3.Visibility = Visibility.Collapsed;
        Food4.Visibility = Visibility.Collapsed;

        int ImageToDisplay = RandomFood.Next(0, 4);

        if (ImageToDisplay == 0)
        {
            Food1.Visibility = Visibility.Visible;
        }
        else if (ImageToDisplay == 1)
        {
            Food2.Visibility = Visibility.Visible;
        }
        else if (ImageToDisplay == 2)
        {
            Food3.Visibility = Visibility.Visible;
        }
        else if (ImageToDisplay == 3)
        {
            Food4.Visibility = Visibility.Visible;
        }

        await Task.Delay(1000);
    }
}

注意async void Button_Click(...)await Task.Delay(1000)。这一切都改变了。

相关问题