2017-04-18 154 views
2

我目前正在使用VisualStudio(WPF应用程序)中的C#/ Xaml为我的第一个项目创建一个游戏。为了简化我的问题,我现在有一个按钮在窗口中的某个位置显示一个随机图像(我放置了4张图像,全部折叠,然后这些代码会随机出现一个图像,然后消失)。C#XAML - For循环只显示最后一次迭代,没有任何介于

我想要一个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秒?

+0

它冻结,因为你告诉它这样做。它做了一堆'if'条件,然后睡觉,当它醒来时它必须执行下一个循环。继续做5次,然后有机会显示最后一张图像,因为这是最后一次迭代发生的情况。你需要[这个](http://stackoverflow.com/questions/5410430/wpf-timer-like-c-sharp-timer) – CodingYoshi

回答

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)。这一切都改变了。

+0

这完美的作品!我做到了这一点,它的工作原理就是我想要的。非常感谢! – freeflow488