WPF - 描画に使用されていないビジュアルツリー?
質問
OnRenderメソッドが呼び出されたときに理解するのを困難にしています。
私の例を考えてみましょう:
onRenderメソッドをオーバーライドするFrameworkElementから派生するクラス要素を持っています。
Grid grid
があるとします。私が期待するものは
var someElement = new SomeElement();
grid.AddVisualChild(someElement);
someElement.InvalidateVisual();
.
someElement.onrenderメソッドをトリガーさせることになります。それは私の場合ではありませんが、次のことが行われます。
var someElement = new SomeElement();
grid.Children.Add(new SomeElement());
someElement.InvalidateVisual();
.
だから私の質問は、それがビジュアルツリーのみに追加されたときにsomeElement
が描かれていない理由です。Property Children
に追加することの重要性は何ですか?
そしてより一般的に、OnRenderはどのように呼ばれるのでしょうか。ビジュアルツリー、またはChildren
プロパティを介して、または?
解決
AddVisualChildはあなたが考えているかもしれないものをしていません。
AddVisualChildは、VisualTreeの2つのビジュアルの間に子親の関係を作成するためのまさにそこにあります。多かれないものは何もない。 VisualTreeはその中にあるすべてをレンダリングしません。
AddLogicalChildは、それだけでLogicalTreeを作成します。 LogicalTreeは通常、VisualTreeよりも小さく、これは速くなります。
あなたの子供のレンダリングを完全にサポートするために、それらの上に測定方法と手法を配置する必要があります。さらに、親のVisualChildrenCountプロパティを変更し、各子に正しいサイズを渡す必要があり、ユーザーがそれらを見ることができるように適切な位置に配置する必要があります。それから物事はレンダリングされます。
AddVisualChildを単独で呼び出してInvalidateVisualは何もしていません。
子供のコレクションは、上記のことを自動的に述べたUIEEEMENTCOLLECTIONです。それが子供たちと協力している理由です(...)。
最前に、あなたは常にあなた自身のことを書く代わりに子供のコレクションと一緒に働いているべきです。
ハイコアのように言及された多くの問題は単に適切なMVVMを有することによって解決することができます。
あなたはカスタムコントロールを持つ必要はありません。