问题背景:
由于该项目是一个触摸屏系统,为了画面美观,几乎每个Form都会有一个比较大的背景图片,而需要我解决问题的这个Form的背景图片Property:676*511,60KB。
注:其实Form中还嵌套了一个Panel。
该Form中共有Label Control 26个,这些Label是用IDE手工添加的,但文字是来自于Hashtable动态添加。
程序运行后,看到的问题就是这些Label不是一起显示,而是一个一个的显示出来,而显示的顺序取决于你向上一级容器中添加的顺序,比如:
this.panel1.Controls.Add(this.label1);
this.panel1.Controls.Add(this.label2);
this.panel1.Controls.Add(this.label3);
this.panel1.Controls.Add(this.label4);
.....................................;
问题出现后:
问题出现后,先后尝试了几套方案
方案一:通过修改容器的Visible属性,即:
this.panel1.Visible = false;
//do something
this.panel1.Visible = true;
方案二:尝试在以下Property中寻找解决办法,盖茨说,下面的Property专门解决次问题。
this.SuspendLayout();
//do something
this.ResumeLayout(false);
注:不过,我曾经尝试过先后去掉这两个property,没有发现有什么不同,也许我还没有完全理解盖茨的话,如有高手了解细节,请赐教。
后来有高人说,这是.Net的策略,是Microsoft底层的东西,目的是为了节省内存空间,我们改变不了。他们这样说也不无道理,因为,该系统的两代前身分别是用VB和Java做的,都没有这样的问题。他们说,要想解决此问题,需利用双缓存技术,很简单,就三句话:
(那三句话我忘了!)
双缓存技术,没有将问题解决。
注:我不是Microsoft崇拜者,只是就事论事。
还有,重写Paint方法后的显示效果,我觉得没有我最终解决后的显示效果更好,也可以说是更快。解决方法见下文……
解决问题:
最后,在几个小时的痛苦摸索中发现了让Form中的Controls一起显示的秘诀。
试验中,我发现即使在一个Form中同时画上几十个Controls都没有问题,只要不设置Form或是Panel的背景图片,几乎都可以做到一起显示。
至此,得出一结论:此问题跟背景图片有关。
然而,背景图片来自于Local,60K的图片几乎可以忽略不计;并且,项目中Form必须要放置背景图片,所以不能在这方面做文章,Pass!
由于要映出背景图片,所以此Form中的几十个label的背景颜色都置成透明(Transparent)。最后发现,问题就出现这些透明的背景颜色上。
最终的解决办法就是把这些Labels都赋上背景颜色,为了达到效果,当然取的颜色和Form的背景图片相一致,在这里我取了白色,只要不把这些label的背景颜色置成透明(transparent),即可以达到一起显示的效果,就这么简单,问题解决后我是又高兴又生气,毕竟花了近一个下午的时间……
最后,由衷感谢在问题提出后,及时给与我帮助的网友: http://community.csdn.net/Expert/topic/4351/4351696.xml?temp=.2896234 |