2010-09-07 55 views
10

我注意到Android,WPF和Silverlight都遵循兩遍佈局模式。有一個遞歸的Measure()方法被調用來調整元素的大小,可能多次。然後調用一個遞歸的Layout/Arrange()方法,該方法將子控件的確切位置設置在其父控件中,並且還會設置控件的最終大小。雙通道UI佈局:爲什麼?

我的問題:爲什麼會分成兩個階段,特別是對於某些類型的控件,Measure()無法計算控件的實際大小而沒有實際佈置子項的位置?是否有某種類型的佈局少數案例可以通過這種方式實現?我試圖創建我自己的UI工具包,而我目前正在傾向於一次通過Layout()模式,但我想確信這是否明智或不合適。

感謝您閱讀本:)

肖恩

回答

12

的原因兩次傳球的是,在結構的任何元素可以影響其他人的剩餘可用空間。

某些元素希望佔用儘可能大的空間,而其他元素具有固定的尺寸。您也可以使用僅設置最大寬度的元素。它創建了一個無法一次解決的方程。

層次結構中的不同面板詢問元素第一遍需要的大小,然後根據每個面板的性質分配它們之間的空間,最後通知每個元素其分配的空間。

編輯:一些更多的解釋

單程佈局的主要缺點是,你正在處理的每個元件順序地。第一個元素佔用一定的空間,其餘的則佔用一定的空間。爲什麼這個元素是第一個?用不同的元素順序嘗試你的算法,你將得到不同的結果佈局。

兩遍佈局模擬每個元素影響整個佈局的並行行爲。

+0

這是最後一點,「最終通知每個元素的分配空間」,這是最重要的部分。小部件管理器不會讓控件大小自己,它只是讓他們提示。 – moswald 2010-09-07 13:51:10

+0

嗯..我得到孩子們如何貪婪地分配他們的大小,然後由父母來解決適當的空間。但是,您可以通過執行每個子項的measure(),然後在父級的layout()調用下爲每個子項執行最終佈局(),以單遍算法實現此目的。這仍然是樹的單個遞歸,但是每個子集都有兩個通行證。我是否認爲這與雙通方法達到了相同的目的,但效率不高? – Sean 2010-09-07 20:39:24

+0

從祖父母的角度來看,父母只是另一個想要衡量的孩子()和佈局()。 ;) – Bubblewrap 2010-09-08 06:28:01