windowsforms.net上面有人搞了一个Windows Forms Markup Language (WFML),还蛮有意思的。可能和XAML有点像,不过我没有研究过XAML。
我写了个简单的例子来研究这个WFML。例如,我在ContextMenu.xml里面用这种WinForm标记语言描述了一个ContextMenu:
<wfml xmlns="http://www.microsoft.com/2003/WindowsForms" xmlns:wfml="http://www.microsoft.com/2003/WFML">
<ContextMenu wfml:root="true" Name="ContextMenu1">
<MenuItem Text="Open" wfml:ID="menuOpen" Click="me.OnMenuOpen" />
<MenuItem Text="Print" wfml:ID="menuPrint" Click="me.OnMenuPrint" />
<MenuItem Text="-" wfml:ID="menuSeperator" />
<MenuItem Text="Exit" wfml:ID="menuExit" Click="me.OnMenuExit" /> ContextMenu>
wfml>
然后,在我的应用程序里面,就可以On-The-Fly的读取这个描述文件来创建一个ContextMenu:
MarkupParser? parser = new MarkupParser();
parser.AddVariable("me", this);
object obj=parser.Parse("ContextMenu.xml");
this.label1.ContextMenu=(ContextMenu)obj;
代码很简洁易懂。这里的MarkupParser就是WFML类库提供的。
如果再花一些时间,还可以做到让用户在程序运行时动态选择ContextMenu需要有哪些项,而且下次运行还能persist前一次的选择。这是运行的截图:

当然,从原理上来说,这些功能不靠WFML也都能做到:你完全可以On-The-Fly的构建一个ContextMenu对象,你可以把菜单项的选择存到注册表以实现persist,或者也可以存成一个XML文件——只不过你需要自己写Serializer、Parser、Mapper,你会累死的。有了WFML,在它的基础上,我们就可以在商业项目中更方便的实现让客户自己订制界面。
有兴趣的可以自己也试试看。你可以在这里下载我做的这个例子程序,里面有完整的可执行文件、WFML库和ContextMenu.xml。至于源代码,就直接用Reflector.NET从Assembly里面看吧。
打印 | 张贴于 2004-03-09 12:31:00 | Tag:Dot NET

留言反馈
-
说说我的看法:WFML并不是用来写Winform程序的。
换句话或,我不觉得将来有一天WinForm也会用类似HTML的markup language来写。因为从开发效率、支持的feature和灵活性上面来说,C#仍然远远好于html这种markup language。
WFML——我觉得——主要的用途就是像我的例子这样用来实现客户定制界面。
将来web和winform会不会合流?可能会,可能不会,我也说不出。
如果合流,可能的方向会有两个:
1)全部走向markup language,运行时需要一个renderer和host
2)全部走向WinForm的方式,以后浏览器里面运行的就是WinForm in IE。
走一步算一步吧,谁也不能预测未来
XAML用.Net FX 2.0提供Partial Class的能力让代码直接访问XAML文件中声明的对象,很直观。
FWML的方式稍微麻烦一些,先在另外单独的代码文件中把WFML文件Parse出来,然后用Parse的Find()来获取声明在FWML中的对象。FWML中声明的对象的事件处理要通过Parser的AddVariable()方法来间接实现。
晚上研究mvm的那个例子。