xaml 和xamlon

    技术2022-05-11  70

    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肯定是一个商业的东西,个人觉得,其商业价值实际上不大,如果做一个开源的项目,倒是非常有意义

     

     

    最新回复(0)