使用WMFL实现可配置Windows窗体

** 使用 WMFL ** ** 实现可配置 Windows ** ** 窗体 **

作者 : Joe Stegman

翻译:秋枫

原文出处:http://windowsforms.net/articles/wfml.aspx

文章原名 : Using the Windows Forms XML Parser Sample

代码下载 : 下载

** Introduction ** ** **

这里介绍的是个带有可以扩展机制的例子,通过添加一个标记模型来实现。我们把里面的解析规则可以概述为“ XML 元素映射到 .NET Framework 类型 而 XML 中的属性映射到类型的属性、方法(或者事件)”。这个例子包含一个 markup parser 通过解析 XML 文件来动态的产生一个对象的实例树。对于标记的格式包括下面的结构:

1. XML 命名空间 到 .NET Framework 命名空间的映射

2. 对象实例化名称

3. 对象验证及引用

4. 属性设置

5. 实例和静态方法

6. 事件委托

7. 组件引用

** Disclaimer ** ** **

这个例子中使用的技术不是下一版本 Windows Forms 的一部分。另外,这里的例子是针对 .NET Framework version 1.1 的,至于其他版本没有测试过。

** Basic Sample **

下面的例子显示了一个 XML 的语法用来声明或定义一个包含了 Label 的简单窗体。

xml version ="1.0" encoding ="utf-8" ?>

mapping xmlns = " http://www.microsoft.com/2003/WindowsForms "

namespace = " System.Windows.Forms;System.Drawing "?>

< wfml xmlns =" http://www.microsoft.com/2003/WindowsForms "

xmlns : wfml ="http://www.microsoft.com/2003/WFML">

< Form wfml : root ="true" Text ="Basic Sample" Size ="300,200">

< Label Text ="Hello World" AutoSize ="True" Location ="10, 20"/>

< method.Show />

Form >

wfml >

WMFL 解析器根据上面的 XML 文件来动态的生成一个窗体。这里假设上面的 XML 文件内容包含在“ basic.xml ”文件中。

MarkupParser parser = new MarkupParser();

object form = parser.Parse("basic.xml");

下面是动态生成的窗体:

**
Dissecting the Basic Sample **

根据 Xml 文档中的定义,解析器进行了精确的处理,一个根标签,实体声明和一个结束标签。下面是对各部分的描述。

** XML Declaration **

xml version ="1.0" encoding ="utf-8" ?>

这行定义了 XML 针对这个例子的默认命名空间同时定义了元素和属性的前缀。

** Instance Declarations **

< Form wfml : root ="true" Text ="Basic Sample" Size ="300,200">

< Label Text ="Hello World" AutoSize ="True" Location ="10 ,20 "/>

< method.Show />

Form >

当处理 xml 的时候,解析器将通过默认构造函数创建一个窗体的实例,同时设置 Text 属性为“ Basic Sample ” ,Size 属性为“ 300 , 200 ”。解析器还创建了一个 Label 实例添加到窗体的 Controls 集合,同时设置了 Label 的 Text 属性为“ Hello World ”,设置他的 AutoSize 属性为“ True ”, Location 属性为“ 10,20 ”。最后,解析器还调用了 Show 方法来显示窗体的实例。

** XML Namespace to .NET Framework Mappings **

解析器通过 标签来创建 System.Windows.Forms.Form 类的一个实例。 .NET Framework 1.1 版本至少包含两个不同的“ Form ”类型:一个是在 System.Windows.Forms 命名空间,另一个是在 System.Web.UI.MobileControls 。解析器通过 Xml 文件中的命名空间映射来选择需要创建的实例的命名空间,在这个例子中, 元素使用默认的命名空间。而这里默认的为 http://www.microsoft.com/2003/WindowsForms :

< wfml xmlns =" http://www.microsoft.com/2003/WindowsForms " …

这里的 “ 映射 ” 就是指示 Xml namespace 到 System.Windows.Forms .NET Framework 命名空间:

mapping xmlns = " http://www.microsoft.com/2003/WindowsForms "

namespace = " System.Windows.Forms;System.Drawing "?>

解析器通过这个映射来选择 Form 的类型命名空间为 System.Windows.Forms 而不是 System.Web.UI.MobileControls”.

** Collection Heuristics **

当解析器遇到元素的子元素时,就会根据上面定义的映射规则来生成相对应的类的实例加入到父控件的一个容器(如果父控件是一个容器,就直接添加)。在默认的情况下,解析器寻找一个“ Controls” 集合但是也可以把子控件通过“ .” 符号加载到的不同的集合。

< MenuItem Text ="New" >

< property.MenuItems >

< MenuItem Text ="Window" Shortcut =" CtrlN " />

< MenuItem Text ="-" />

< MenuItem Text ="Message" />

< MenuItem Text ="Post" />

< MenuItem Text ="Contact" />

< MenuItem Text ="Internet Call" />

property.MenuItems >

<p class="MsoNormal" style="BACKGROUND: #e6e6e6; MARGIN: 0c

Published At
Categories with Web编程
Tagged with
comments powered by Disqus