2013-02-08 44 views
2

我正在處理具有自定義面板和自定義面板內部的自定義控件我有一個小而簡單的MeasureOverride方法,該方法將double.PositiveInfinity的大小傳遞給其子MeasureOverride方法。自定義面板應該注意佈局,它應該根據窗口大小讓孩子變大或變小。使用double.PositiveInfinity測量控件WPF

如果你已經處理了控件,那麼你應該知道wpf佈局系統是如何工作的,並且基本上每個小孩都調用MeasureOverride來調用childs children的MeasureOverride等等。

現在的問題是,當我調整窗口的大小,自定義面板並獲得接收到的標誌做的措施再次因此MeasureOverride不會再次調用,但這次在經過double.PositiveInfitinty大小的孩子,孩子MeasureOverride根本不會被調用(但是應該根據WPF佈局系統的定義調用該方法)。爲什麼?我一直認爲,當我給父母打電話MeasureOverride時,孩子也會被迫做這個測量。

很明顯,我錯了,所以有人可以解釋我如何控制/孩子知道什麼時候再次測量?

順便說一句,我將double.PositiveInfinity的大小傳遞給孩子,告訴他們需要儘可能多的空間。

代碼:

protected override Size MeasureOverride(Size availableSize) 
{ 
double x; 
double y; 
var children = this.InternalChildren; 
for (int i = 0; i < children.Count; i++) 
    { 
     UIElement child = children[i]; 
     child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity); 
     y += child.DesiredSize.Height; 
     x = Math.Max(x, child.DesiredSize.Width); 
     } 
return new Size(x, y); 
} 

代碼很簡單。我不明白爲什麼孩子們不能再次測量。抱歉,如果我在代碼中拼寫錯了。

+0

請向我們展示您的自定義面板的'MeasureOverride'方法的代碼。 – 2013-02-08 15:20:08

+0

我發佈了代碼。 – cyberist 2013-02-08 15:30:52

回答

2

您的孩子不會再次進行測量,因爲他們不需要:因爲您保持傳遞相同的大小,WPF知道沒有理由再次測量,因爲結果DesiredSize將是相同的。

這就是說,Desiredsize更新Measure只是你的孩子認爲最合適的大小。你應該重寫ArrangeOverride時將其考慮在內,但你沒有義務:簡單地按照你喜歡的方式安排你的孩子,MeasureOverride被調用或不爲你的孩子應該是無關緊要的。

+0

這是否意味着他們永遠不會再被測量,因爲我會一直把它們傳給他們兩倍。正確無限?我需要給他們打電話來衡量。當窗戶大小發生變化時,每個孩子都需要測量,因爲孩子有特定的測量邏輯。 – cyberist 2013-02-08 16:09:34

+1

然後,您應該使用給定的約束來度量元素,或者您需要以某種方式通知尺寸更改的元素並使其度量失效。當然要注意,使該度量無效只會使該元素而不是它的任何後代或其祖先變髒,因此,如果您依賴於DesiredSize進行更改,則需要沿着元素樹走向,並使所有度量變爲無效面板使這些兒童和麪板之間的耦合非常緊密。 – AndrewS 2013-02-08 18:43:22

+0

可以說我的面板有300x300,然後我將一個孩子的寬度尺寸更改爲400.如果在此情況下,如果孩子> 300,我如何告訴我的面板使面板失效? – cyberist 2013-02-08 21:16:22

0

您是否試過撥打UIElement.InvalidateMeasureUIElement是您的父母面板?

+0

我有和它不工作。 – cyberist 2013-02-08 15:22:30