2014-05-04 23 views
1

對於我來說,這將是邏輯,如果的MeasureOverride計算FrameworkElement的ArrangeOverride只是位置的子元素的大小。但ArrangeOverride不僅安排子元素。它也計算了我不明白的FrameworkElement的大小。爲什麼不能MeasureOverride計算最終大小,那是多少?爲什麼ArrangeOverride重新計算的最終大小

回答

1

因爲您的元素可能不是屏幕上唯一的元素。

佈局不是那麼簡單。 WPF必須計算出它必須使用的實際物理空間,然後計算每個元素需要多少空間,如果可能的話,按比例調整請求的數量,然後應用它。此外,有些元素可能希望根據分配的空間量進行更改。

This previous answer of mine給你一個比喻。

+0

謝謝。特別是鏈接的答案是好的。您是否有一個示例,最終大小與MeasureOverride返回的大小不同? – Sam

+0

@Sam No我沒有舉手的例子,但是你可以通過從MeasureOverride中返回一個非常大的尺寸來僞造它(並檢查結果),該尺寸包含在某個被限制爲人工小區域的東西中(即它是絕對大小和位置)。 – slugster

1

如果您實現自己的面板,用自己的佈局算法,並在您的ArrangeOverride()調用

child.Arrange(rect1) 

與Rect1的比孩子的DesiredSize不同,那麼系統可以任意決定忽略Rect1的大小和用途有些不同。我已經看到DesiredSize被使用了,我不確定是否總是這樣。我想說這是類似於bug的東西:)

如果在面板的MeasureOverride()傳遞中計算rect1,則此行爲的解決方法是第二次傳遞該子代時調用Measure() rect1的大小,因此在Arrange()傳遞之前重新計算子對象的DesiredSize。