2017-04-02 60 views
-1

我正在使用MVVM,当模型计算一个位置的新背景时,它会告诉视图模型它已更改。所以我想要做的是在每个新的背景下更新视图,但我认为Thread.Sleep会阻止主UI线程。WPF在循环中更新视图

private void New_Background(object sender, BackgroundEventArgs e) 
    { 
     Application.Current.Dispatcher.InvokeAsync(new Action(() => 
     { 
      Fields[e.Position].Background = e.Background; //update this position's background at every step 
      OnPropertyChanged("Background"); 
      Thread.Sleep(50); 
     })); 
    } 

有没有办法实现这个目标?顺便说一下,如果我使用MessageBox.Show(...)而不是Thread.Sleep,它会更新每个消息框处的视图。

+0

*“......它告诉视图模型,它的改变” *你不觉得你的视图模型可以反过来也通知认为它已经改变,无需事件驱动的更新或定时器驱动的循环? – slugster

+0

这就是为什么有“OnPropertyChanged(”背景“);”行,所以与视图的绑定起作用。更新实际上是有效的,但对于Thread.Sleep,我认为我阻止了UI线程,因此它不会更新。我正在寻找另一种方法。 –

回答

-1

设置更高的priority

Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Send, 
new Action(() => 
     { 
      Fields[e.Position].Background = e.Background; //update this position's background at every step 
      OnPropertyChanged("Background"); 
     })); 
+0

Task.Delay没有推迟任何事情。 –

+0

@KollingMaster:顺便说一句,你为什么要延迟?你是否想给UI线程一个机会?我不确定你的目标是什么。请显示整个逻辑。 – CharithJ

+0

该模型使用一种总是计算下一步的算法。下一步总是有一个新的背景图片。因此,在每一个新的步骤中,我想更新视图,以便显示图片的实际位置,而不是算法开始之前的站立位置。基本上我想更新循环内的视图。 –

0

...但我认为Thread.sleep代码块的主UI线程。

是的,它的确如此。您传递给Application.Current.Dispatcher.InvokeAsync方法的代理正在UI线程上执行。

我该如何延迟它,使它变慢一点?

放慢循环:

private async void New_Background(object sender, BackgroundEventArgs e) 
{ 
    await Task.Delay(1000); 
    Application.Current.Dispatcher.Invoke(new Action(async() => 
    { 
     Fields[e.Position].Background = e.Background; //update this position's background at every step 
     OnPropertyChanged("Background"); 
    })); 
}