我很难理解何时调用OnRender方法。以我的例子为例:我有一个从FrameworkElement派生的类SomeElement,它覆盖了OnRender方法。假设我有一个Grid grid
。我所期望的是
var someElement = new SomeElement();
grid.AddVisualChild(someElement);
someElement.InvalidateVisual();
将导致触发SomeElement.Onder方法。在我的情况下没有,但以下内容确实存在:
var someElement = new SomeElement();
grid.Children.Add(new SomeElement());
someElement.InvalidateVisual();
所以我的问题是,当someElement
仅添加到视觉树中时,为什么不绘制它。将其添加到属性Children
的重要性是什么?更一般地说,OnRender是如何命名的?通过可视化树或Children
属性,或者?
AddVisualChild没有做你可能认为是做的事情。
AddVisualChild只是在VisualTree中创建两个视觉效果之间的父子关系。或多或少都没有。VisualTree不会渲染其中的所有内容。
AddLogicalChild的作用与创建LogicalTree相同。LogicalTree通常比VisualTree更小、更短,这意味着它更快。
为了完全支持孩子的渲染,您需要对他们调用measure方法和arrange方法。此外,您需要更改父级的VisualChildrenCount属性,并将正确的大小传递给每个子级,您需要将它们放置在适当的位置,以便用户能够看到它们。然后事情就会被渲染。
单独调用AddVisualChild和InvalidateVisual没有任何作用。
另一方面,Children集合是一个UIElementCollection,它自动完成我提到的所有上述操作。这就是为什么它与儿童合作。添加(…).
此外,你应该一直致力于儿童收藏,而不是写你自己的东西。
就像HighCore提到的那样,许多问题可以通过简单地拥有一个合适的MVVM来解决。
也许您不需要自定义控件。