首页 电脑学院 黑客教程 网站技术 网页特效 免费论文 公文写作 演讲发言 实用文档 职场指南 时尚生活 情感男女 其他资讯

您的位置:首页-> 网站技术-> .NET技术-> 使用WMFL实现可配置Windows窗体
使用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>

MenuItem>

在上面的例子中,那些子菜单被明确的加入到父一级的MenuItem的“MenuItems”集合中。对于“property.PropertyName”符号在下面的Markup reference一节中会有更多的详细说明。



Markup Reference

这个简单的解析器使用一些的属性,元素和一些其他符号指令来处理转换。那些属性和元素在http://www.microsoft.com/2003/WFML命名空间下,同时使用“wfml”作为前缀。

wfml:ID Attribute

这个ID属性用来唯一表示元素的实例。另外,解析器还提供一个API通过ID来查询一个实例,在下面的例子中,Form元素被给了“form1”。

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:ID="form1" Text="Basic Sample" Size="300,200">

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

<method.Show/>

Form>

wfml>

解析器能通过“Find”方法来重新获取“form1”实例。

MarkupParser parser = new MarkupParser();

Parser.Parse(“basic.xml”);

Form form1 =(Form)parser.Find(“form1”);

wfml:root Attribute

root属性标识由解析器的“Parser”方法生成的实例。整个Xml只能有一个元素使用root属性。下面的例子中“form1”元素包含了“root”属性。

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:ID="form1" wfml:root="true" Text="Basic Sample" Size="300,200">

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

<method.Show/>

Form>

wfml>

下面是“Parse”方法返回一个“form1”实例:

MarkupParser parser = new Markupparser();

Form form1 = (Form)parser.Parse(“basic.xml”);

wfml:argument Attribute

当实例化类型的时侯,解析器使用类型的默认构造函数。但是有些类型没有默认的构造函数,比如Bitmap。

Argument属性专门为没有默认构造函数的类型传递一个参数。下面的例子就是为Bitmap的构造函数传递一个“c:\image.jpg”参数。

<Form wfml:root="true" wfml:ID="form1" Name="Form1" Text="Set Background">

<property.BackgroundImage>

<Bitmap wfml:argument="C:\\image.jpg"/>

property.BackgroundImage>

<method.Show/>

Form>

注意这里如果是使用带多个参数的构造函数是不可能的。

property Element

解析器的通常规则是xml元素映射到类型而xml属性映射到类型的属性。

<Element Attribute="string value"/>

解析器能通过TypeConverters(System.ComponentModel.TypeConverter)来有效的处理字符串到非字符串属性的转换。举例Form类的BackColor属性是“System.Drawing.Color”类型的,但是可以使用下面的设置:

<Form BackColor="Green"/>

在上面的例子中,BackColor属性是通过一个TypeConverter来把“Green”字符串转换成“System.Drawing.Color”得到的。在一般情况下TypeCoverter模块可以很正常的工作,但是在处理复杂的属性类型时(比如Image)不会提供一个很好的结果。解析器通过使用一个“.”属性符号来处理更多复杂属性的设置,下面使用就是设置窗体的BackgroundImage:

<Form wfml:root="true" wfml:ID="form1" Name="Form1" Text="Set Background">

<property.BackgroundImage>

<Bitmap wfml:argument="C:\\image.jpg"/>

property.BackgroundImage>

<method.Show/>

Form>

在上面的例子中,把Bitmap实例作为窗体的BackgroundImage设置。

method Element

类似于上面的“.”属性符号,解析支持“.”方法符号。当解析器发现一个元素带有“method.methodName”,他将会在父元素实例中调用“methodName”方法。下面就会在“form1”实例中调用“Show”方法。

<Form wfml:root="true" wfml:ID="form1" Name="Form1" Text="Set Background">

<property.BackgroundImage>

<Bitmap wfml:argument="C:\\image.jpg"/>

property.BackgroundImage>

<method.Show/>

Form>

解析器能调用实例或静态函数,但是不能调用含有多个参数的方法。下面的例子是调用带有一个参数的静态方法:

<Form wfml:root="true" wfml:ID="form1" Name="Form1" Text="Set Background">

<property.BackgroundImage>

<method.FromFile Static="System.Drawing.Image">

C:\\image.jpg

method.FromFile>

property.BackgroundImage>

<method.Show/>

Form>

上面调用静态方法“System.Drawing.Image.FromFile”,参数为“c:\image.jpg”。窗体的的BackgroundImage属性值为静态方法的返回值。

wfml:var Element

解析器对创建引用类型的变量提供了有限的支持。任何属性使用wfml:ID 属性能被解析为引用类型。如下:

<Form wfml:ID="form1" Name="Form1" Text="Simple"/>

<wfml:var Name="form1">

<method.Show/>

wfml:var>

在上面的例子中,“wfml:var”元素引用“form1”参数也就是窗体,“Show”方法在“form1”的实例中被调用。

Variable Prefix

以“$”开始的属性值被处理为是引用参数。

<wfml:var wfml:ID="image">

<method.FromFile Static="System.Drawing.Image">C:\\image.jpgmethod.FromFile>

wfml:var>

<Form BackgroundImage="$image" Name="Form1" Text="Set Background">

<method.Show/>

Form>

Mapping Processing Instruction

通常的使用语法是:

mapping xmlns="XMLNamespace" namespace=".NET Namespaces"?>

.NET Framework命名空间属性可以包含一个或多个用“;”隔开的列表。

mapping xmlns="MyNamespace" namespace="System.Windows.Forms;System.Drawing"?>

在实例化类型的时侯,解析器将会映射Xml元素中指定的“xmlns”到.NET Framework类型。

Assembly Processing Instruction

对于“assembly”的处理指令是通过添加装配件引用。

assembly name="system.data" version="1.0.5000.0" culture="neutral" PublicKeyToken="b77a5c561934e089"?>

Markup Parser Reference

解析器根据Xml文件动态的生成一个实例树,而他的API描述如下:

Parse 方法使用一个字符串参数或者一个TextReader作为参数。该方法返回的一个实例是文档里那个包含了“wfml:root”的属性的元素的ID值,或者就是第一个元素。

AddVariable Method

下面的例子将产生一个窗体同时包装窗体的Load事件:

<Form wfml:root="true" Load="me.FormLoadHandler" Text="Load Sample"/>

解析器会认出“Load”是一个事件并寻找一个“me”的变量同时把窗体的Load事件用“me’s”的FormLoadHandler委托来包装。

private void button1_Click(object sender, System.EventArgs e)

{

MarkupParser parser = new MarkupParser();

// Add "this"

parser.AddVariable("me", this);

// Parse

object obj = parser.Parse("sample.xml");

}



private void FormLoadHandler(object sender, EventArgs e)

{

MessageBox.Show("Form Load");

}

Find Method

Find方法被用来从变量上下文中重新获得一个实例(wfml:ID)。举例,下面的例子定义了一个“form1”窗体,里面包含了一个“button1”按钮:

<Form wfml:root="true" wfml:ID="form1" Text="Find Sample">

<Button wfml:ID="button1"/>

Form>

通过Find方法能够重新得到“button1”的实例:

private void button1_Click(object sender, System.EventArgs e)

{

MarkupParser parser = new MarkupParser();

// Parse (returns form1)

object obj = parser.Parse("sample.xml");

// Get button1 instance

Button button1 = parser.Find("button1") as Button;

}

Reset Method

解析器的变量上下文(变量列表)是跨多个解析器实例共享的(静态列表)。

Reset方法就是用来清空这个共享变量列表。

Status Event

解析器的状态事件提供每一行的解析信息。注意这个事件只有在调试场景下才有用。


在百度中查找更多使用WMFL实现可配置Windows窗体的内容
职场宝典   职场故事   职场跳槽   职场文化   职场理财   职场充电   情感天地   职场女性   职场礼仪   职场新人
报告总结   述职报告 工作总结 调查报告 工作汇报 计划方案 个人总结 社会实践 规章制度 调研报告 
  实习报告 考察报告 辞职报告 
演讲发言   竞职演说   就职演说   精彩演说   爱国演讲   英语演讲   十七大演讲   安全生产演讲稿   
节日祝福   重阳节 国庆节 教师节 中秋节 情人节 七夕节 劳动节 妇女节 清明节 愚人节 春节 元旦 圣诞节  儿童节  端午节 母亲节 新婚祝福 生日祝福 
讲话致辞   开业开幕   会议主持   庆典致辞   会议发言   党风廉政   党政报告   贺电慰问   婚丧嫁娶   思想宣传
法律常识   基本常识   法律文书   权益常识   劳动保障   婚姻继承   民事诉讼   刑事诉讼   
党建材料   入党申请   思想学习   党性分析   思想汇报   转正申请   民主生活   党委党建   入团申请   申报材料
求职简历   个人简历   求职自荐   求职谋略   面试技巧   求职英语   自我鉴定   英文简历   简历封面
心得体会   心得体会   经验交流   读后感   
时政热点   和谐社会   先进性教育   新农村建设   十七大   八荣八耻   科学发展观   劳动合同法   
人际沟通   社交技巧   社交礼仪   口才技巧   谈话技巧   演讲技巧   
营销技巧   电话销售   网络销售   推销技巧   促销技巧   销售口才   营销手段   销售技巧   谈判技巧   

“ 使用WMFL实现可配置Windows窗体”来源于网络,版权归作者所有!勿用于商业用途。

.NET技术

ASP技术
PHP技术
JSP技术
.NET技术
服务器技术
数据库开发
其它类

本类阅读TOP10

·数据库的连接串(中文)
·DES(Data Encryption Standard)加密解密整理
·利用Jmail发送和接收邮件(C#)
·.NET Framework 中多语言支持的实现
·动态菜单
·.NET 框架类库(上)
·C#中的事件
·微软.NET战略和ASP.NET简介(1)
·加密与解密
·ASP.NET中的代码分离

广告


关于本站|服务条款|广告服务|客服中心|发布文章|网站留言