复杂布局的重用,比较容易实现的就是GridLayout,至于FormLayout,基本上如果相似度不是很大,很难重用。我们在实现很多Page的时候,优先考虑的都会是GridLayout。但GridLayout在界面元素改动较大的时候也拥有一些弊端,比之FormLayout要麻烦的多。
当界面元素拥有上下文的时候,随着其上下文的改变,要想界面元素按照新的上下文重新布局,总是让人头疼。因为首先能想到的方法就是隐藏掉不需要的元素,这样会减少时间和代码上的开销。但是如果采用GridLayout布局的时候,一个Widget隐藏的时候,它仍然占用着界面空间,即使将它的hightHint和widthHint设置为0,依然不能解决问题,因为GridLayout通常设置了verticalSpacing和horizontalSpacing。
现在想到的一个解决方案就是将界面元素重新洗牌。 界面元素的生成由Model里的各个元素来决定。界面的上下文都交由一个属性控制层进行控制,它上承GUI界面,下接业务模型,属于一个过渡的层次。该层可以装饰业务模型,并附加上新的上下文,形成一个新的Model。根据这个新的Model,我们在界面上创造元素。如果Model仅仅只是值发生了变化,我们重新设置界面的值即可。如果Model发生了上下文的变化,比如不需要某个属性了或者是增加一个属性,我们就对整个界面进行重新洗牌,通过一个循环Dispose掉所有的Widget,然后根据新的上下文重新初始化界面元素,并进行赋值。由于MVC的分离,重新初始化界面是很容易的。对于不太复杂的Page,布局上的问题就可以迎刃而解,而且在时间上的开销也不会体现得很明显,至少并看不出显示上的延迟。