2

我无法理解何时调用 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属性,还是?

4

1 回答 1

4

AddVisualChild 没有做您可能认为的事情。

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

AddLogicalChild 的作用相同,只是它创建了 LogicalTree。LogicalTree 通常比 VisualTree 更小更短,这意味着它更快。

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

单独调用 AddVisualChild 而 InvalidateVisual 没有做任何事情。

另一方面,儿童集合是一个 UIElementCollection,它自动完成我提到的所有上述事情。这就是它与 Children.Add(...) 一起工作的原因。

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

就像 HighCore 提到的,许多问题都可以通过简单的 MVVM 来解决。

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

于 2014-01-09T07:37:18.110 回答