天天看點

以Model為核心的表單設計器的思路

設計思路:

    之是以會我想到以Model為核心,主要借鑒Asp.net MVC架構。ASP.NET MVC中控制器向View提供Model。View将Model渲染成表單。有一點不好的是生成的View中夾雜了HTML和C#代碼,沒有了ASP.Net Web Form的使用者控件,是以就不能去可視化拖拽了,看下面ASP.net MVC生成表單的兩張圖。

    簡單的List頁面:

    Detail頁面:

    從上圖中可以看出不存在控件,那就不能可視化的拖拽。

    我做這個設計器的目的之一就是解決這個不能拖拽的問題,先對比一下asp.net表單生成機制和我的表單設計器的機制:

    從上圖可以看出兩種機制是差不多的。

    mvc中有ModeL和ViewModel兩個概念。Model是一般都固定不變的,編譯之後就會存在dll,是以通過下面代碼使用反射來生成表單。

<a></a>

1 System.Windows.Forms.OpenFileDialog dlg =new System.Windows.Forms.OpenFileDialog(); 

2 dlg.AutoUpgradeEnabled =false;

3 if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)

4 {

5 string fileName = dlg.FileName;

6 txtPath.Text = fileName;

7 System.Reflection.Assembly ass;

8 Type[] types;

9 ass = System.Reflection.Assembly.LoadFile(fileName);//要絕對路徑

10 //擷取是以的實體類

11   types = ass.GetTypes();

12 foreach(Type type in types)

13 {

14 ListBoxItem li =new ListBoxItem();

15 li.Content = type.Namespace+"."+type.Name;

16 lbxModel.Items.Add(li);

17 

18 }

19 

20 

21 

22 }

     對于ViewModel,我計劃先使用SQL語句生成ViewModel的結構和代碼,然後生表單。

    Model方式界面:

   ViewModel方式界面:

簡單示例:

    看個例子,實體類代碼如下:

1 publicclass Person

2 {

3 publicstring Name

5 get;

6 set;

7 }

9 publicint Age

10 {

11 get;

12 set;

13 }

14 

15 publicstring Sex

16 {

17 get;

18 set;

19 }

20 }

    在List頁面,我生成一個固定的Grid和以下常用的工具欄按鈕如:新增、修改、删除...,如下如。

   對于修改頁面、詳情頁面等,我生成label+textbox組合方式的表單。

下面我們就可以自由調整界面了:

調整之後的一級界面

調整之後的二級界面

最後通過代碼生成機制生成aspx代碼。

總結:這個是我思考出的一個表單設計器的解決方案,感覺比較簡單而且比較通用,故寫這篇文章做為一個分享。考慮不周的地方期待大家多多指正。

本文轉自麒麟部落格園部落格,原文連結:http://www.cnblogs.com/zhuqil/archive/2010/09/24/model-wpf-form-designer.html,如需轉載請自行聯系原作者