xaml 大家都知道了,只是能正式使用它还遥遥无期,xamlon则是一个第三方的解决方案,在.net 1.1上,提供了类似xaml 的功能。
Xamlon is XAML for Windows.Forms,是其在网站上对xamlon的解释,现在可以在网站上下载pre betahttp://66.27.62.90
试用的结果,当然不是很满意。
xaml最简单的实现,其实就是读入xml文件,依次分析,遇见一个标记,如<text Text="hello"/>就实例化一个对象,如Text text=new Text();并且设置属性text.Text="Hello";然后加入到容器控件中,如Canvas,Window等w.Controls.Add(text);
当然,xaml中还有许多的特性,但最大的特色,脚本和代码的分离,依赖.net 2.0中的partial(vb中为expands),布局上有LayoutEngine等。
partial使得xml中提供的ui类和后面的代码类实际上在同一个类中,而xamlon显然不是这样的,它现在只支持事件类,其效果类似于以下代码
EventClass ec=new EventClass();
button1.Click+=new EventHanlder(ec.BindEventName);
事件类在容器(Window或Canvas等中定义,如)
<Window def:Class="命名空间.类名" ></Window>
.net 中有GridPanel,FlowPanel等,xamlon中也提供了一个GridPanel,FlowPanel,不过这个GridPanel竟然没有Columns属性,很显然,下面的代码是不会运行的
<GridPanel Columns="2"> <SimpleText>Testing</SimpleText> <SimpleText>1</SimpleText> <SimpleText>2</SimpleText> <SimpleText>3</SimpleText></GridPanel>
目前,看不出这个GridPanel和FlowPanel有什么区别
大家看xaml 的例子,可以看到基于文本的一些灵活性,如id="Textbox1"Width="90px" 或Width="100%"或Canvas.Top="10" 或FontSize="24"等
如果在.net framework 的Control去派生,则Control的原属性都会碰到问题如width是intCanvas.Top这样的属性设置不能识别FontSize 没有这样的属性
这也就是为什么在Xaml不用System.Windows.Forms命名空间,而是要有MSAvalon.Windows, MSAvalon.Windows.Input, MSAvalon.Windows.Controls等新的命名空间的缘故
从这里也可以看出,ms在设计.net framework并没有考虑到xaml的出现,特别像web forms中control 的id属性,而windows forms中的control无id属性,虽然其力求 web和desktop的统一性,但设计时还是没有考虑很多
Xamlon的实现还不完备,所以像这样的xmal例子,并不能运行<Canvas xmlns="http://schemas.microsoft.com/2003/xaml" Background="LightCyan" Width="100%" Height="100%"> <Image Source="lh.bmp" Canvas.Left="5" Canvas.Top="5" /> <Text Canvas.Left="90" Canvas.Top="20" FontSize="36">Hello, Longhorn! </Text></Canvas>
大家可以知道原因Image不是个从control派生对对象,,Text对象并不存在于.net framework 命名空间Canvas.left,canvas.Top,FontSize等均不能解释修改成如下
<Canvas xmlns="http://schemas.microsoft.com/2003/xaml" Width="640" Height="480"> <TextBox Left="90" Top="20">Hello, Longhorn!</TextBox> </Canvas>
一些要点
1、对象、属性大小写敏感2、属性值注意类型,enum类型,直接写其字符串值即可,bool 则是true和falseLocation="{3, 16}"或Location="{X=175,Y=0}"设置3、定义一个事件类<Window def:Class="命名空间.类名" ></Window> 4、 创建自己的控件从Control和从Control派生的类中继承实现Xamlon.Windows.IAddChild接口<Window xmlns:sample="sample"> <sample:PoweredByLabel Dock="Bottom" Width="125" Height="15"/></Window>
结论,xamlon要完全兼容xaml,必须提供全部MsAvalon.Windows.Controls部分的实现,这个工作不复杂,但工作量不小,或许等xamlon完备,xaml就正式出来的,xamlon肯定是一个商业的东西,个人觉得,其商业价值实际上不大,如果做一个开源的项目,倒是非常有意义