2013-05-09 75 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); 
    } 
}