2011-02-01 8 views
6

Dispatcher.PushFrameを使用してコードをブロックし、長時間実行されるプロセスが完了するまでUIをリフレッシュさせます。 Dispatcher.PushFrameへの呼び出しがボタンのクリックイベントからのものである限り、これは期待通りに機能します。しかし、ページのLoadedイベントまたはコンストラクタでこの同じコードを使用すると、UIがリフレッシュされず、塗りつぶされません。私はランダムな実験として、コンストラクタからWindow.ShowDialogを使ってみましたが、モーダルダイアログが閉じられるまでコントロールがブロックされていても、UIにペイントすることはできます。 Dispatcher.PushFrameまたは他の手動メカニズムを使用して、ページ読み込みイベントからこの機能を許可するソリューションを誰にでも提供できますか?Dispatcher.PushFrameスタイルのプロセスがWPFページでブロックされています。

補足として、私のウィンドウを最小化または最大化すると、UIペイントと私は通常それとやり取りできますが、手動でサイズ変更を実行するまではできません。

+0

誰かが気にしているなら、[msdn forums](http://social.msdn.microsoft.com/Forums/en/wpf/thread/e2c85fa9-09c2-4eb1-bdd7)でこの質問に関するいくつかの背景情報があります。 -78d8f2d6aaf3)。 (それはそこに答えたようにマークされています...) –

+0

@ user598946、あなたの質問は本当にMSDNフォーラムで答えられました。その答えに、あなたが明確ではないことは何かありますか? –

答えて

3

MSDNのObject Lifetime Eventsの私の読んだところでは、Reflectorを迂回すると、他のイベントと同じようにイベントが発生しないように見えます。内部的には、BroadcastEventHelperクラスが使用され、最終的にDispatcherPriority.Loadedレベルに上げる前に、ビジュアルツリー内のすべての要素の間で様々なLoadedイベントを調整します。

私はこれがあなたにこの動作を見せていると考えています。

具体的な解決策としては、長時間実行するタスクをPage.Loadedイベントハンドラに配置せず、代わりにBackgroundWorkerまたはTaskを発行して作業を完了することをお勧めします。

関連する問題