繁体   English   中英

WPF-视觉树不用于绘图吗?

[英]WPF - Visual tree not used for drawing?

我很难理解何时调用OnRender方法。 考虑我的示例:我有一个继承自FrameworkElement的SomeElement类,该类重写OnRender方法。 假设我有一个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添加到可视化树中却没有绘制它。 将其添加到Children属性中有什么重要性? 更一般地说,OnRender怎么称呼? 通过视觉树,还是Children属性,还是?

AddVisualChild没有做您可能想做的事情。

AddVisualChild就是在那里在VisualTree中的两个视觉对象之间创建子对父关系。 或多或少。 VisualTree不会渲染其中的所有内容。

AddLogicalChild所做的只是创建LogicalTree。 LogicalTree通常比VisualTree小和短,这意味着它更快。

为了完全支持孩子的渲染,您需要在孩子身上调用measure方法并安排方法。 此外,您需要更改父级的VisualChildrenCount属性并将正确的尺寸传递给每个孩子,并且需要将它们放置在适当的位置,以便用户能够看到它们。 然后,事物将被渲染。

单独调用AddVisualChild和InvalidateVisual不会执行任何操作。

另一方面,Children集合是一个UIElementCollection,它可以自动执行上述所有操作。 这就是为什么它与Children.Add(...)一起工作的原因。

此外,您应该始终使用Children系列,而不是编写自己的东西。

像提到的HighCore一样,只需拥有适当的MVVM即可解决许多问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM