web-dev-qa-db-ja.com

WPFがキャンバスの再描画を強制する

さて、Windowsフォームでは、.refresh()を使用して要素に再描画イベントを発生させることができます。 WPFに同様のソリューションはありますか?

私がしていることの説明、私はキャンバスオブジェクトに迷路を描いています、そして解決策が突然現れるのを28分待つのではなく、迷路が描かれているのを見たいです(進行状況を見ることができます)。一連のRectanglesを使用してキャンバス上にブロックを描画しています。更新は長方形またはキャンバスで行う必要がありますか?

最近の出力は次のとおりです: http://imgur.com/ftFOv

可能であれば、c#での解決策が欲しいのですが。ありがとう。

10
ohmusama

Dispatcher オブジェクトを使用することをお勧めします。このShawnWildermuthの記事をご覧になることをお勧めします: ディスパッチャーを使用してよりレスポンシブなアプリを構築する (MSDNマガジン2007年10月)。

8
Simon Mourier

これはあなたが探しているものです...

element.InvalidateVisual();
30
Adam

私のためのこの仕事...

element.UpdateLayout();
12
Jonathan Molina

良い 最小限、完全、検証可能なコード例 何をしているかを明確に示すことがなければ、ここでの最良の答えが何であるかを確実に知ることは不可能です。ただし、説明からは、迷路生成アルゴリズムがUIスレッドで実行されているように聞こえ、UIがそれ自体を更新するのをブロックしています。

人々がRefresh()Application.DoEvents()のようなメソッドを呼び出したくなるWinformsの場合と同じように、ここでの本当の問題はあなたがUIスレッドをブロックします。それを修正する正しい方法、つまりそれをしないでください

選択肢はたくさんあり、より詳細な質問がなければ、あなたのケースで最善のアプローチが何であるかを知る方法はありません。ただし、最も一般的に使用され、適切である可能性が最も高い2つの手法は、BackgroundWorkerまたはTask.Run()Progress<T>クラスと組み合わせて使用​​することです。いずれの場合も、アルゴリズムは別のスレッドで実行され、UIスレッドに定期的に更新を渡します(たとえば、すべての長方形、10個の長方形ごとなど)。 UIスレッドは更新を受信し、データをビジュアルに追加してから、次の更新の待機に戻ります。

BackgroundWorkerProgress<T>はどちらも、データをUIスレッドに自動的にマーシャリングするための組み込みメカニズムを提供します。唯一の注意点は、使用しているクラスのいずれであっても、そのクラスのインスタンスをUIスレッドで作成する必要があるということです。非同期作業の実行を開始する前にセットアップする必要があるため、これは通常問題にはなりません。それは無料で来ます。

このようにすれば、これまでにここで提案された3つの異なるハックのようなハックは必要ありません(そのうちの2つは、「UIスレッドをブロックしました」では適用できないようです。とにかく今何?」シナリオ)。

4
Peter Duniho