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

これを実現する手段はありますか? ところで、Thread.Sleepの代わりにMessageBox.Show(...)を使用すると、すべてのメッセージボックスでビューが更新されます。

+0

*あなたのviewmodelはターンでも、それが変更されたことをビューに通知することができると考えてはいけない*「...それが変わったのというのviewmodelを伝えます」イベント駆動型アップデートやタイマー駆動型ループの必要性を排除しますか? – slugster

+0

そのため、 "OnPropertyChanged(" Background ");"ビューとのバインドが機能します。アップデートは実際には動作しますが、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"); 
    })); 
} 
関連する問題