AppleSeeker's Tech Blog
Welcome to AppleSeeker's space

.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(100200);
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(100200),
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(100240)
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

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

posted on 2009-01-23 17:34  AppleSeeker(冯峰)  阅读(2576)  评论(1编辑  收藏  举报