2013-05-09 42 views
1

我想在Y軸上做一個System.Windows.Shapes.Rectangle旋轉模擬卡片旋轉,顯示所有的路線。UI刷新循環Dispatcher.BeginInvoke

問題是UI只在最後刷新。

簡化代碼版本

方法的調用

for (i=0; i<=180; i++) 
{ 
    int j = i; 
    Dispatcher.BeginInvoke(new a_dispatcher(() => { 
      print_animation_of_card(card, i); 
     }), 
     null); 
} 

方法

private void print_animation_of_card(System.Windows.Shapes.Rectangle card) 
{ 
    ... 
    System.Windows.Media.PlaneProjection p = 
     card.Projection as System.Windows.Media.PlaneProjection; 
    p.RotationY = i; 
    card.Projection = p; 
} 

我也試圖把換入的方法,同結果...

我該如何顯示System.Windows.Shapes.Rectangle的所有旋轉運動?

回答

0

我認爲問題在於您正在使用BeginInvoke()而不是Invoke。這並不等待一個旋轉角度在下一個被調用之前完成,所以這些調用都堆疊在彼此之上。

試試Dispatcher.Invoke()或將整個循環放入一個Dispatcher.BeginInvoke(),看看結果是否更符合您的滿意度。

+0

我使用Silverlight的工作,所以invoke()方法不可用...... 我試圖把循環在Dispatcher.BeginInvoke()中,但沒有結果,我已經通過將Dispatcher.BeginInvoke()放入Backgroundworker中來實現它,但是我寧願在沒有多線程的情況下工作... – 2013-05-09 17:15:42

+0

@Korbert如果你不是在'BackgroundWorker'開頭,那爲什麼要使用'Dispatcher.BeginInvoke()'呢?你應該可以直接操作卡片'矩形'。 – Jay 2013-05-09 18:20:09

+0

是的,但我想向用戶顯示所有的矩形旋轉動畫。如果我通常沒有調度員,我只會看到最後的位置。我以爲我可以用Dispatcher.BeginInvoke()顯示所有的動作,我錯了嗎? – 2013-05-10 07:33:26

0

最後我用BackgroundWorker做了它,謝謝@Jay的答案。

方法的調用

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += (object sender, DoWorkEventArgs e) => 
{ 
    print_animation_of_card(card); 
}; 
bw.RunWorkerAsync(); 

方法

private void print_animation_of_card(System.Windows.Shapes.Rectangle card) 
{ 
    for (int i = 0; i <= 180; i++) 
    { 
     Thread.Sleep(3); 
     Dispatcher.BeginInvoke(new a_dispatcher(() => 
     { 
      //same code as topic method code 
     }),null); 
    } 
}