4

いくつかの複雑なシナリオでレンダリングに時間がかかることがある WPF カスタム コントロールがあります。カスタム コントロールにプレースホルダー イメージを表示するように指示し (たとえば、「お待ちください - レンダリングします!」)、アイドル時間 (入力が処理された後) に実際にコントロールをレンダリングできるようにしたいと考えています。

親グリッドと 2 つの子 (A) プレースホルダー イメージと B) 実際のコンテンツを保持するようにカスタム コントロールを変更する方向に沿って考えています。デフォルトでは A) が表示され、カスタム コントロールの表示が変更されると、A) の代わりに B) を表示するデリゲートを BeginInvoke できます。

画面上にそのようなコントロール インスタンスが多数または複数存在する場合、すべてを同時にレンダリングしている間、メイン スレッドをブロックしないことを願っています。デリゲートは入力優先度よりも低い優先度でキューに入れられるため、UI は理論的には非常に応答性が高いままである必要があります。

誰かが同様の問題に遭遇したことがありますか?

4

1 に答える 1

1

はい、このアプローチはうまく機能し、私はそれを何度か使用しました。

通常、レンダリングの前にコントロールがデータを取得または処理する必要がある場合は、このアプローチを使用します。このようなすべての作業をバックグラウンド スレッドで実行してから、要素の Dispatcher を使用して実際のレンダリングの更新を呼び出すことをお勧めします。

ヒント: タイプ int の Revision などと呼ばれる内部 DP を宣言し、AffectsRender に登録することがよくあります。次に、バックグラウンド スレッドが重い処理を完了すると、BeginInvoke() 呼び出しで Revision プロパティをインクリメントできます。これにより、レンダリングが無効になり、新しいレンダリング パスが発生します。その後、通常どおり、OnRender オーバーライドで適切なレンダリング ロジックを実行できます。

于 2010-02-17T19:02:52.110 に答える