2010-04-06 56 views
5

我試圖構建一個簡單的面板,其中包含一個孩子並將其對齊到最近的網格大小。我很難弄清楚如何通過覆蓋MeasureOverride和ArrangeOverride來做到這一點。需要幫助瞭解WPF MeasureOverride和ArrangeOverride的無限大小和0大小

以下是我所追求的:我希望我的小組告訴它的主人:(a)它希望儘可能大,然後(b)當它發現這個尺寸是什麼時,尺寸會自己調整,其子UIElement根據最近的較小的捕捉點。因此,如果我們捕捉到10位,並且我可以位於不大於192x184的區域,那麼面板會告訴其父容器「我的實際尺寸將爲190x180」。這樣,任何接近我的控制的東西都可以與其邊緣對齊,而不是潛在的空間。

當我把我的面板放到一個Grid中時,我得到0或PositiveInfinity(我忘了)覆蓋中的傳入大小,但是我需要知道的是「我的空間實際上可以有多大?不是無窮大..

問題的一部分我認爲是什麼WPF考慮PositiveInfinity的魔術值和大小爲0。我需要一種方法來說,通過MeasureOverride「我可以儘可能的大,你可以讓我」,並在ArrangeOverride實際上大小的快照大小。

或者我是否完全錯誤的方式?測量和排列看起來非常複雜,只是在Reflector中的標準面板代碼中漫遊一下。

回答

5

在度量步驟中,如果WPF向您發送無窮大,則應該告訴它您想要的大小。如果它發送0,那麼你的佈局幾乎沒有空間。在排列步驟中,您會被告知有多少空間可用於佈局,這很可能與您在度量步驟中給出的大小不同。你無法在任何一步中返回無窮大。下面的代碼應該完成你以後的事情(注意我假設一個UIElement子屬性):

protected overrride Size MeasureOverride(Size availableSize) 
{ 
    Child.Measure(availableSize); 
    return Child.DesiredSize; 
} 

protected override Size ArrangeOverride(Size finalSize) 
{ 
    int w = (((int)finalSize.Width)/SnapPrecision) * SnapPrecision; 
    int h = (((int)finalSize.Height)/SnapPrecision) * SnapPrecision; 

    Child.Arrange(new Rect(0, 0, w, h)); 
    return new Size(w, h); 
}