2014-01-08 41 views
2

我在调用OnRender方法时遇到了麻烦。 考虑我的例子: 我有一个派生自FrameworkElement的SomeElement类,它覆盖了OnRender方法。 假设我有一个Grid grid。我期望的是,WPF - 可视化树不用于绘图?

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属性,或?

+0

你想做什么?重写'OnRender()'并不是你经常在WPF中执行的事情。 –

+0

尽管在网格实例上很难调用受保护的AddVisualChild方法。 – Clemens

+0

@HighCore:我试图在网格上画几条线。我想我会把它们放在一个专门绘制这些线条的元素中。我是新来的WPF btw,因为你可能会注意到... – JBSnorro

回答

3

AddVisualChild没有做你可能会想到的事情。

AddVisualChild只是在那里创建VisualTree中两个视觉效果之间的子女父母关系。没有更多或更少。 VisualTree不会呈现其中的所有内容。

AddLogicalChild做同样的事情就是创建LogicalTree。 LogicalTree通常比VisualTree更小更短,这意味着它更快。

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

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

另一方面,儿童收藏是一个UIElementCollection,可以自动完成上述所有事情。这就是为什么它使用Children.Add(...)。

此外,你应该始终与Children集合合作,而不是写自己的东西。

和HighCore一样,许多问题都可以通过简单的MVVM解决。

也许你不需要有一个自定义控件。