2011-11-01 69 views
1

我有一個For..Each循環,它將循環遍歷所有網格的矩形並隨機更改它們的填充。我用彩色動畫改變填充。這裏是我的代碼:對於每個循環不睡眠

 Dim rand as new random 
     Dim changeColor As New Animation.ColorAnimation 

     changeColor.Duration = TimeSpan.FromSeconds(0.5) 

     For Each r As Rectangle In Grid.Children 
      changeColor.From = ColorConverter.ConvertFromString(r.Fill.ToString)    
      Dim i As Integer = rand.Next(0, 2) 
      Select Case i 
       Case 0 
        changeColor.To = Colors.White 
       Case 1 
        changeColor.To = Colors.Gray 
      End Select 
      Animation.Storyboard.SetTarget(changeColor, r) 
      Animation.Storyboard.SetTargetProperty(changeColor, New PropertyPath("Fill.Color")) 
      Dim sb As New Animation.Storyboard 
      sb.Children.Add(changeColor) 

      sb.Begin() 
      System.Threading.Thread.Sleep(0.5) 
     Next 

的問題是,循環不睡覺。我想觸發動畫,然後等待,直到矩形填充被改變,然後繼續其餘部分,但似乎所有的矩形填充都在同一時間改變。那麼我做錯了什麼?

+0

它看起來像你讓主線睡覺。這意味着動畫可能甚至不會在thread.sleep完成之後纔開始。 –

回答

2

你睡覺了UI線程,所以循環和所有渲染都被暫停。你可以嘗試像我寫的另一個問題的方法,如this one

編輯:同樣改變Michael Holdshteyn指出的時間。

+0

您能否將您的答案中的代碼轉換爲VB.NET? – Cobold

+0

@Cobold:我不會說VB.NET,但[這個轉換器工具]可能會幫助你。 (也可以說C#與VB.NET相比並不難理解) –

0

替換:

System.Threading.Thread.Sleep(0.5) 

隨着:

System.Threading.Thread.Sleep(500) 

睡眠值是一個整數並is in Milliseconds。當你做Sleep(0.5)你所得到的只是一個上下文切換。

+0

這不起作用,它只是等待每個矩形的0.5秒,並且只有在它處理了所有矩形後纔會改變其顏色。 – Cobold

0

Thread.Sleep以MILLISECONDS作爲時間。所以你說你想讓它睡0.5毫秒(或0.00005秒)。

這可能會或可能不足以完成任務。

然後,您也可能在與UI相同的線程中運行。如果是這種情況,那麼除非視覺效果無效,否則在完成處理之前屏幕不會刷新。