.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);
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 }
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 }
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
文章导读:移动开发索引贴