.Net Micro Framework本身支持WPF界面开发,但是对国内用户来说,WPF开发相对比较陌生,并且.Net Micro Framework对此功能的支持并不完善,Button、TextBox、ListBox、PictureBox等等基本控件并不支持,所以要想在.Net Micro Framework上开发出一套相对复杂的窗体界面还是比较困难的。

System.Windows.Form库就是在这种背景下开发出来的,它提供的接口和控件,和.Net Framework及.Net Compact Framework保持兼容,也可以说是.Net Compact Framework的一个窗体子集(不仅仅是子集,有写功能略有扩展,如Graphics类支持图片透明、渐变、圆角矩形绘制等等方法)。

由于.Net Micro Framework的IDE开发环境并不支持所见即所得的窗体设计功能(以后有时间可以为MF开发这一功能),所以我们可以取巧,用.Net Framework和.Net Compact Framework开发环境设计窗体,然后把相关窗体文件(如Form1.cs和Form1.designer.cs文件)直接导入到.Net Micro Framework工程中,稍加删减即可为.Net Micro Framework所用。

 

开源System.Windows.Forms库,让.Net Micro Framework界面开发和上位机一样简单    _Framework

 

 

System.Windows.Form目前包括Button、TextBox、ListBox、ComboBox、CheckBox、GroupBox、RadioButton、PictureBox、ProgressBar、VScrollBar、HScrollBar等11种常用控件,此外还提供了MessageBox方法。

包含两类窗体、普通窗体及模式窗体,含义和windows平台相同。

此外System.Windows.Form提供两种界面风格,上面的计算器显示的是SideShow风格的窗体,缺省风格和.Net Compact Framework一致(如下图):

 

开源System.Windows.Forms库,让.Net Micro Framework界面开发和上位机一样简单    _Net_02

 

 

 

值得一提的是,System.Windows.Form完美支持中文,提供了Arial两种类型的字体(规则、粗体),含有3000多个常用汉字及字符。其使用方法和.Net Framework一致,如果您一致使用缺省字体,您会忽略还有字体设置这一说法的存在。不过考虑到.Net Micro Framework用到资源有限的设备上,所以还是把字体库进行了剥离,可以根据需要自行增删字体(默认字库的大小为546k)。

下面的图例就是基于System.Windows.Form库开发的应用程序。

 

开源System.Windows.Forms库,让.Net Micro Framework界面开发和上位机一样简单    _System_03

 

 

 

System.Windows.Form库支持多窗体,并且支持软键盘,所以考虑到窗体关闭、切换等操作,故引入了任务栏(和Windows Mobile的任务栏有些类似),相关功能如下图所示。

 

开源System.Windows.Forms库,让.Net Micro Framework界面开发和上位机一样简单    _Framework_04

 

 

为了便于说明System.Windows.Form库的方便性,我们试着比较一下.Net Micro Framework默认窗体开发和用System.Windows.Form库开发的代码区别。

.Net Micro Framework默认窗体程序包含两个文件,一个是按钮配置程序GPIOButtonInputProvider.cs,相关代码如下:

  1. using Microsoft.SPOT;  
  2.  
  3. using Microsoft.SPOT.Input;  
  4.  
  5. using Microsoft.SPOT.Hardware;  
  6.  
  7. using Microsoft.SPOT.Presentation;  
  8.  
  9. namespace MFWindowApplication1  
  10.  
  11. {  
  12.  
  13.     public sealed class GPIOButtonInputProvider  
  14.  
  15.     {  
  16.  
  17.         public readonly Dispatcher Dispatcher;  
  18.  
  19.         private ButtonPad[] buttons;  
  20.  
  21.         private DispatcherOperationCallback callback;  
  22.  
  23.         private InputProviderSite site;  
  24.  
  25.         private PresentationSource source;  
  26.  
  27.    
  28.  
  29.         /////////////////////省略多个按钮操作相关函数/////////////////////  
  30.  
  31.     }  
  32.  
  33. }  
  34.  

第二个是主体文件Program.cs,代码如下:

  1. using System;  
  2.  
  3. using Microsoft.SPOT;  
  4.  
  5. using Microsoft.SPOT.Input;  
  6.  
  7. using Microsoft.SPOT.Presentation;  
  8.  
  9. using Microsoft.SPOT.Presentation.Controls;  
  10.  
  11. namespace MFWindowApplication1  
  12.  
  13. {  
  14.  
  15.     public class Program : Microsoft.SPOT.Application  
  16.  
  17.     {  
  18.  
  19.         public static void Main()  
  20.  
  21.         {  
  22.  
  23.             Program myApplication = new Program();  
  24.  
  25.             Window mainWindow = myApplication.CreateWindow();  
  26.  
  27.             GPIOButtonInputProvider inputProvider = new GPIOButtonInputProvider(null);  
  28.  
  29.             myApplication.Run(mainWindow);  
  30.  
  31.         }  
  32.  
  33.         private Window mainWindow;  
  34.  
  35.         public Window CreateWindow()  
  36.  
  37.         {  
  38.  
  39.             mainWindow = new Window();  
  40.  
  41.             mainWindow.Height = SystemMetrics.ScreenHeight;  
  42.  
  43.             mainWindow.Width = SystemMetrics.ScreenWidth;  
  44.  
  45.             Text text = new Text();  
  46.  
  47.             text.Font = Resources.GetFont(Resources.FontResources.small);  
  48.  
  49.             text.TextContent = Resources.GetString(Resources.StringResources.String1);  
  50.  
  51.             text.HorizontalAlignment = Microsoft.SPOT.Presentation.HorizontalAlignment.Center;  
  52.  
  53.             text.VerticalAlignment = Microsoft.SPOT.Presentation.VerticalAlignment.Center;  
  54.  
  55.             mainWindow.Child = text;  
  56.  
  57.             mainWindow.AddHandler(Buttons.ButtonUpEvent, new ButtonEventHandler(OnButtonUp), false);  
  58.  
  59.             mainWindow.Visibility = Visibility.Visible;  
  60.  
  61.             Buttons.Focus(mainWindow);  
  62.  
  63.             return mainWindow;  
  64.  
  65.         }  
  66.  
  67.         private void OnButtonUp(object sender, ButtonEventArgs e)  
  68.  
  69.         {  
  70.  
  71.             Debug.Print(e.Button.ToString());  
  72.  
  73.         }  
  74.  
  75.     }  
  76.  
  77. }  
  78.  
  79.    
  80.  

而用System.Windows.Form库开发的窗体程序则和.Net Framework及.Net Compact Framework相同,包括三个文件,第一个文件是窗体设计文件Form1.Designer.cs,代码如下:

  1. namespace Test  
  2.  
  3. {  
  4.  
  5.     partial class Form1  
  6.  
  7.     {  
  8.  
  9.         #region Windows Form Designer generated code  
  10.  
  11.         private void InitializeComponent()  
  12.  
  13.         {  
  14.  
  15.             this.label1 = new System.Windows.Forms.Label();  
  16.  
  17.             this.SuspendLayout();  
  18.  
  19.             //   
  20.  
  21.             // label1  
  22.  
  23.             //   
  24.  
  25.             this.label1.Location = new System.Drawing.Point(105, 69);  
  26.  
  27.             this.label1.Name = "label1";  
  28.  
  29.             this.label1.Size = new System.Drawing.Size(125, 12);  
  30.  
  31.             this.label1.Text = ".Net Micro Framework";  
  32.  
  33.             //   
  34.  
  35.             // Form1  
  36.  
  37.             //   
  38.  
  39.             this.Controls.Add(this.label1);  
  40.  
  41.             this.Name = "Form1";  
  42.  
  43.             this.Text = "Form1";  
  44.  
  45.             this.ResumeLayout(false);  
  46.  
  47.         }  
  48.  
  49.         #endregion  
  50.  
  51.         private System.Windows.Forms.Label label1;  
  52.  
  53.     }  
  54.  
  55. }  
  56.  

第二个是窗体文件Form1.cs,代码如下:

  1. using System;  
  2.  
  3. using System.Drawing;  
  4.  
  5. using System.Windows.Forms;  
  6.  
  7. namespace Test  
  8.  
  9. {  
  10.  
  11.     public partial class Form1 : Form  
  12.  
  13.     {  
  14.  
  15.         public Form1()  
  16.  
  17.         {  
  18.  
  19.             InitializeComponent();  
  20.  
  21.             this.KeyDown += new KeyEventHandler(Form1_KeyDown);  
  22.  
  23.         }  
  24.  
  25.         void Form1_KeyDown(object sender, KeyEventArgs e)  
  26.  
  27.         {  
  28.  
  29.             Debug.Print(e.KeyCode.ToString());  
  30.  
  31.         }  
  32.  
  33.     }  
  34.  
  35. }  
  36.  

第三个是启动文件Program.cs,代码如下:

  1. using System;  
  2.  
  3. namespace Test  
  4.  
  5. {  
  6.  
  7.     static class Program  
  8.  
  9.     {  
  10.  
  11.         static void Main()  
  12.  
  13.         {  
  14.  
  15.             Application.Run(new Form1());  
  16.  
  17.         }  
  18.  
  19.     }  
  20.  
  21. }  
  22.  
  23.    
  24.  

从以上比较可以看出,采用System.Windows.Form库开发的窗体简单,并且和.Net Framework及.Net Compact Framework没有任何区别,所以很方便的把相应平台上的代码移植到.Net Micro Framework上来。

System.Windows.Form库除了字体操作和位图取之.Net Micro Framework原图形库,其它所有函数和类库,均自行编写,和.Net Micro Framework自带的WPF库没有任何关系。目前System.Windows.Form库开发的难点主要在控件焦点切换和刷新方面,现在的版本是测试版,后面将继续优化,如有可能核心源码考虑用C++本地代码进行实现,这样性能就会得到大幅度提升。

后续版本的开发计划暂考虑如下:

1、  TextBox控件继续完善,支持光标操作;

2、  支持中文输入法;

3、  开发ListView和TreeView控件;

4、  部分核心代码用C++本地代码实现。

 

【×××】

http://www.sky-walker.com.cn/yefan/SourceCode/YFWindows.rar


【技术交流】http://space.cnblogs.com/group/MFSoft/