設計思路:
之是以會我想到以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 }
8
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,如需轉載請自行聯系原作者