復(fù)雜布局的重用,比較容易實(shí)現(xiàn)的就是GridLayout,至于FormLayout,基本上如果相似度不是很大,很難重用。我們?cè)趯?shí)現(xiàn)很多Page的時(shí)候,優(yōu)先考慮的都會(huì)是GridLayout。但GridLayout在界面元素改動(dòng)較大的時(shí)候也擁有一些弊端,比之FormLayout要麻煩的多。
當(dāng)界面元素?fù)碛猩舷挛牡臅r(shí)候,隨著其上下文的改變,要想界面元素按照新的上下文重新布局,總是讓人頭疼。因?yàn)槭紫饶芟氲降姆椒ň褪请[藏掉不需要的元素,這樣會(huì)減少時(shí)間和代碼上的開(kāi)銷。但是如果采用GridLayout布局的時(shí)候,一個(gè)Widget隱藏的時(shí)候,它仍然占用著界面空間,即使將它的hightHint和widthHint設(shè)置為0,依然不能解決問(wèn)題,因?yàn)镚ridLayout通常設(shè)置了verticalSpacing和horizontalSpacing。
現(xiàn)在想到的一個(gè)解決方案就是將界面元素重新洗牌。 界面元素的生成由Model里的各個(gè)元素來(lái)決定。界面的上下文都交由一個(gè)屬性控制層進(jìn)行控制,它上承GUI界面,下接業(yè)務(wù)模型,屬于一個(gè)過(guò)渡的層次。該層可以裝飾業(yè)務(wù)模型,并附加上新的上下文,形成一個(gè)新的Model。根據(jù)這個(gè)新的Model,我們?cè)诮缑嫔蟿?chuàng)造元素。如果Model僅僅只是值發(fā)生了變化,我們重新設(shè)置界面的值即可。如果Model發(fā)生了上下文的變化,比如不需要某個(gè)屬性了或者是增加一個(gè)屬性,我們就對(duì)整個(gè)界面進(jìn)行重新洗牌,通過(guò)一個(gè)循環(huán)Dispose掉所有的Widget,然后根據(jù)新的上下文重新初始化界面元素,并進(jìn)行賦值。由于MVC的分離,重新初始化界面是很容易的。對(duì)于不太復(fù)雜的Page,布局上的問(wèn)題就可以迎刃而解,而且在時(shí)間上的開(kāi)銷也不會(huì)體現(xiàn)得很明顯,至少并看不出顯示上的延遲。