2017-04-02 42 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"); 
    })); 
}