0

現在、複数の子 (CHILD) ユーザー コントロールを含むことができる WPF ユーザー コントロール (PARENT) を作成しています。(CHILD) コントロールをポリラインで接続しています。

これを行うには、CHILD ユーザー コントロールの場所が必要です。ただし、VisualTreeHelper.GetOffset から取得した場所はゼロです。コントロールの OnLoaded イベント ハンドラーにコードを配置すると、子コントロールの正しい場所が取得されるため、WPF はおそらく、CHILD コントロールのサイズ変更とメモリへの配置をまだ完了していません。

親コントロールをロードした後でも、子コントロールを追加して行を更新できるようにしたいので、これは問題です。

私が現在これを解決した方法は、CHILD コントロールの OnRender をオーバーライドし、MAIN コントロールのイベントを発生させて、VisualTreeHelper を使用して正しい値を取得できることを認識させることです。

ただし、これは、最後の CHILD コントロールのレンダリングが完了するまで、線を再描画する必要があることを意味します。

私の現在の解決策は、解決策というよりも回避策のように感じます。VisualTreeHelper から正確な結果を得るために、WPF rendercycle にどのように「プラグイン」できますか?

4

1 に答える 1

3

親コントロールで ArrangeOverride または OnRender をオーバーライドしてみてください。WPF は 3 段階のレイアウト/レンダー パスを実行します。まず、コントロールに必要なスペースの量を尋ね (測定)、次に、受け取ったすべての要求に対して実際に与えられたスペースの量をコントロールに伝え (配置)、次に実際には、各コントロールが与えられた領域内のすべてを描画します (レンダリング)。これが機能するためには、ビジュアル ツリーに従います。ルート要素 (たとえば、ウィンドウ) は測定するように指示されます。全体がルートに戻り始める前に、子供たちに測定を依頼する必要があります。次に、アレンジ パスを開始し、最後にレンダー パスを開始します。

子の OnRender を監視することで、メジャーとアレンジが発生した後で描画を開始したいが、親がそれ自体を描画し始める前に暗黙的に言っていることになります。これは、子の OnRender をラップする親の OnRender と同等にすることができます。親の ArrangeOverride でこれを行うこともできます。これは、子の Arrange パスをラップします。これは、(IIRC) VisualTreeHelper.GetOffset() がアクセスする値が実際に設定される場所です。

最後に、親コントロールを見ると、すべての子コントロールの配置/レンダリングが終了するのを暗黙のうちに待機しています。つまり、最後の子コントロールのレンダリングがいつ終了したかを把握しようとして、あやふやにする必要はありません。

于 2009-10-29T17:16:51.630 に答える