簡體   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