.Net Compact Framework 基础篇(11)--使用范型来创建控件

.net cf 1.0->.net cf 2.0->.net cf3.5
随着cf版本的升级,我们不断的在使用着cf提供的新功能。有没有想过如何改善代码质量?不仅使得代码看起来更清晰呢?

随着C#3.0的推出,相信泛型已成为大家耳熟能详的名词。在今后的项目中,我们如不尝试使用它来创建控件吧。

原先,我们在Form上添加一个控件,使用如下方法:

1  Button clickButton  =   new  Button();
2  clickButton.Name  =   " button " ;
3  clickButton.Text  =   " Click Me " ;
4  clickButton.Location  =   new  Point( 100 200 );
5  clickButton.Font  =   this .Font;
6  this .Controls.Add(clickButton);

我们使用范型来改善下:

 1  public  Form1()
 2  {
 3      InitializeComponent();
 4 
 5       //  Create button and add it to the Form's controls collection
 6      Button clickButton  =   this .AddControl < Button > (c  =>   new  Button()
 7      {
 8          Name  =   " button " ,
 9          Text  =   " Click Me " ,
10          Location  =   new  Point( 100 200 ),
11          Font  =  c.Font
12      });
13       //  Hook up into the click event
14      clickButton.Click  +=   new  EventHandler(clickButton_Click);
15       //  Create label
16       this .AddControl < Label > (c  =>   new  Label()
17      {
18          Name  =   " labelHello " ,
19          Location  =   new  Point( 100 240 )
20      });
21  }
22 
23  void  clickButton_Click( object  sender, EventArgs e)
24  {
25       //  Assign the value to the Text property of the label
26       this .GetControl < Label > ( " labelHello " ).Text  =   " Hello world. " ;
27  }

 

 1  public   static   class  ControlExtension
 2  {
 3       public   static  T AddControl < T > ( this  Control parent,Func < Control, T >  build)
 4      {
 5          T control  =  build(parent);
 6          parent.Controls.Add(control  as  Control);
 7           return  control;
 8      }
 9 
10       public   static  Control GetControl( this  Control parent,  string  name)
11      {
12           return  parent.Controls.OfType < Control > ().SingleOrDefault(c  =>  c.Name  ==  name);
13      }
14 
15       public   static  T GetControl < T > ( this  Control parent,  string  name)    where  T : Control
16      {
17           return  parent.Controls.OfType < Control > ().SingleOrDefault(c  =>  c.Name  ==  name)  as  T;
18      }
19  }

 

这样代码看起来更清晰,虽然多做了一些额外的工作,但使得我们的工作更有效了。
优点:代码更清晰,适用于动态添加控件。
缺点:代码与Design无法兼容阿,不利于UI调试。不适用于非动态添加控件,毕竟在WM系统中通过.net cf来动态创建很多控件是很消耗资源的。

这篇文章参考自:Alex Yakhnin的《Generic control creation.
文章中的代码在WM中有一个地方需修改,在ControlExtension类中,parent.Controls集合对象不支持直接用名字来查找控件。故此需要做一些小的调整。

运行环境:VS2008 + WM6.0 + .net cf3.5

Author:AppleSeeker(冯峰)
Date:2009-01-23

文章导读:移动开发索引贴

你可能感兴趣的:(framework)