WPF-可视化树不用于绘图



我很难理解何时调用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来解决。

也许您不需要自定义控件。

相关内容

  • 没有找到相关文章

最新更新