2014-01-08 101 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解決。

也許你不需要有一個自定義控件。