2011-06-08 148 views
2

我通過簡單地從面板擴展/繼承創建了一個自定義版本的畫布。在WPF中使用AddLogicalChild,AddVisualChild添加UIElement

當我想繪製或渲染一些東西時,我只需創建一個DrawingVisual,繪製所需的圖形並調用AddLogicalChild(Visual),AddVisualChild(Visual)並遞增面板的視圖計數。

這時候我加入DrawingVisual情況下的偉大工程,但是當我試圖在這裏加入Button並定義尺寸(MinHeightMinWidth),它不顯示。

UIElements是否有可能需要顯示不同的處理邏輯?基本上,我怎樣才能將UIElement添加到擴展Panel將被顯示,並可以用?

回答

0

UIElement S,它的收藏Children使用:

public void AddChild(UIElement newChild) 
{ 
    this.Children.Add(newChild); 
} 

你也應該看看InternalChildren收集這是建議報告中的Panel小號的擴展使用。

+0

這是真的,但AddLogicalChild/AddVisualChild覆蓋任何其他視覺效果。換句話說,只要我通過調用這兩種方法創建視覺,孩子就不會被畫出來。 – grizzly 2011-06-08 12:24:37

+0

好吧我嘗試添加到InternalChildren集合,但視覺上沒有發生任何事情。我猜想有兩種可能的情況:Visuals和Add ... Child不是用來與現有控件一起使用,或者我錯過了某些東西... – grizzly 2011-06-09 07:57:01

0

如果只UIElement小號工作時,首選的方法是添加項目到Children集合。

,如果你有和UIElement個混合Visual小號,我會建議使用的方法AddLogicalChild/AddVisualChild代替Children。然而,這需要更多一點的工作:

  1. 添加的項目(Visual S以及UIElement S)作爲邏輯和視覺的孩子,使用AddLogicalChildAddVisualChild
  2. 存儲項目的地方(在面板不會爲你做)
  3. 覆蓋GetVisualChildVisualChildrenCount和返回的項目數/上傳遞的索引項
  4. 覆蓋的MeasureOverride,呼籲各UIElementUIElement.Measure,並盡一切其他措施的東西,是特定於您的面板
  5. 覆蓋ArrangeOverride,呼籲UIElement.Arrange每個UIElement,做所有的其他安排的東西,是特定於您的面板

請注意,MeasureArrange必須在之後被稱爲UIElement已被添加到Panel

就是這樣。 :)