发明的详细说明
本发明提供了一种机制,该机制允许用户用XML标识语言指定对象层次和随后的程序设计逻辑。这为对象模型提供了用XML来描述的能力。一个结果是:可以使用XML来访问这些可扩展类(例如,微软公司生产的“.NET构架”的“共同语言运行(时)(CLR)”中的类)。CLR中的类数目在不断增长,这意味着:对象模型的XML表示法正在动态地发展。如这里所描述的,该机制提供XML标签到CLR对象的直接映射,以及使用该标识来表示相关代码的能力。可以使用该机制来创建固定格式文档、适应流动文档、矢量图形、应用程序用户界面和控制器、XML标签中的类似物和前述内容的任何组合。
参考这些附图(其中,相同的参考数字提及相同的元件),本发明被展示为在合适的计算环境中加以实施。虽然未作要求,但是,将在正由个人计算机执行的计算机可执行指令(例如,程序模块)的一般上下文中描述本发明。通常,程序模块包括完成特殊任务或实施特殊的抽象数据类型的例行程序、程序、对象、部件、数据结构等。而且,精通该技术领域的人将会理解:可以利用其他的计算机系统配置来实践本发明,这些计算机系统配置包括手持设备、多处理器系统、基于微处理器的或可编程的消费电子设备、网络PC、小型计算机、大型计算机和类似设备。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以用本地记忆存储设备和远程记忆存储设备来定位。
图1说明了可实施本发明的合适的计算系统环境的例子100。计算系统环境100只是合适的计算环境的一个例子,它并不意在对本发明的使用或功能性的范围提出任何限制。也不应该将计算环境100解释成对示范操作环境100中所展示的任何一个部件或部件组合的任何从属性或要求。
本发明可用于众多其他的通用或专用计算系统环境或配置。可能适用于本发明的众所周知的计算系统、环境和/或配置的例子包括(但不局限于)个人计算机、服务器计算机、手持设备或便携式设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境,以及类似设备。
本发明计算机可执行指令的一般上下文例如,计算可执行的程序模块来描述。通常,程序模块包括完成特殊任务或实施特殊的抽象数据类型的例行程序、程序、对象、部件、数据结构等。本发明也可以在分布式计算环境中实践,在这些分布式计算环境中,由通过通信网络连接的远程处理设备来完成任务。在分布式计算环境中,程序模块可以用包括内存存储设备在内的本地计算机存储介质和远程计算机存储介质来定位。
参照图1,实施本发明的示范系统包括通用计算设备10。计算机110的部件可以包括,但不局限于处理单元120、系统存储器130和系统总线121,系统总线121将包括系统内存在内各种系统部件耦合到处理单元120。系统总线121可以是任几种类型的总线结构,包括一内存总线或内存储控制器、一外设总线和一使用任种总线体系构造的局部总线。举例来讲且不作限制,这类体系构造包括“工业标准结构”(ISA)总线、“微通道结构”(MCA)总线、“增强ISA(EISA)”总线、“视频电子标准协会”(VESA)局域总线和所谓“夹层(Mezzanine)总线”的“外设部件互连”(PCI)总线。
计算机110通常包括各种计算机可读介质。计算机可读介质可以是计算机110可存取的任何可用介质,它包括易失和非易失介质、可移动和不可移动的介质。举例来讲。且不作限制,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括易失和非易失的,可移动和不可移动介质,该介质用任何方法或技术实施对信息例如,计算机可读指令、数据结构、程序模块或其他数据的存储。计算机存储介质包括,但不局限于RAM、ROM、EEPROM、闪存或其他存储技术、CD-ROM、数字通用光盘(DVD)或其他光盘存储器、盒式磁带、磁带、磁盘存储器或其他磁性存储设备、或可以被用来存储所需信息并被计算机110存取的任何其他介质。通信介质通常具体表现计算机可读指令、数据结构、程序模块或调制数据信号,例如,载波或其他传送机制中的其他数据,它包括任何信息传递介质。术语“调制数据信号”意味着一种信号有一个或多个特征组中按一种方式改变为该信号的编码信息。举例来讲且不作限制,通信介质包括有线介质例如,有线网络或直接线连接和无线介质例如,声音、RF、红外线和其他无线介质。上述任何组合也应该被包括在计算机可读介质的范围内。
系统内存130包括采取易失和/或非易失存储器例如,只读存储器(ROM)131和随机存取存储器(RAM)132形式的计算机存储介质。基本输入/输出系统133(BIOS)通常被存储在ROM 131中,该基本输入/输出系统包含有助于在计算机110内的各个元件之间传送信息,例如,在启动期间的基本例行程序。RAM 132通常包含可立即由处理单元120进行存取和/或目前正由处理单元120进行操作的数据和/或程序模块。举例来讲但不作限制,图1展示了操作系统134、应用程序135、其他程序模块136和程序数据137。
计算机110也可以包括其他可移动/不可移动,易失/非易失计算机存储介质。仅仅举例来讲,图1展示了对不可移动的,非易失磁性介质读取或写入的硬盘驱动器141、对可移动的,非易失磁盘152读取或写入的磁盘驱动器151,以及对可移动的,非易失光盘156例如,CD ROM或其他光学介质,读取或写入的光盘驱动器155。该示范操作环境中可以使用的其他可移动/不可移动的,易失/非易失计算机存储介质包括,但不局限于卡型盒式磁带机、闪存卡、数字通用光盘、数字录像带、固态RAM、固态ROM和类似的存储介质。硬盘驱动器141通常通过不可移动的存储器接口,例如,接口140连接到系统总线121,而磁盘驱动器151和光盘驱动器155通常用可移动的存储器接口,例如,接口150连接到系统总线121。
以上所讨论的和图1中所展示的这些驱动器及其关联的计算机存储介质为计算机110提供计算机可读指令、数据结构、程序模块和其他数据的存储。在图1中,例如,硬盘驱动器141被展示为存储操作系统144、应用程序145、其他程序模块146和程序数据147。注意,这些部件可以等同于或不同于操作系统134、应用程序135、其他程序模块136和程序数据137。操作系统144、应用程序145、其他程序模块146和程序数据147在这里被提供不同的号码,以展示:它们至少是不同的副本。用户可以通过输入设备,例如,键盘162和定点设备161,通常被称作“鼠标”、“跟踪球”或“触摸垫”)将输入命令和信息计算机110。其他输入设备(未示出)可以包括话筒、操纵杆、游戏垫、卫星圆盘、扫描仪或类似的输入设备。这些和其他输入设备经常通过被耦合到该系统总线的用户输入接口160连接到处理单元120,但也可以用其他接口和总线结构,例如,并行端口、游戏端口或通用串行总线(USB))连接。监视器191或其他类型的显示设备也经由接口,例如,视频接口190连接到系统总线121。除监视器以外,计算机还可以包括其他外设输出设备例如,扬声器197和打印机196,这些外设输出设备可输出外设接口195连接。
计算机110可以在使用与一台或多台远程计算机,例如,远程计算机180的逻辑连接的联网环境中进行操作。远程计算机180可能是另一台个人计算机、服务器、路由器、网络PC、对等设备或其他公共的网络节点,它通常包括上述与个人计算机110有关的许多或全部部件,尽管图1中只展示了内存储181。图1中所描绘的这些逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可以包括其他网络。这类连网环境在办公室、企业范围的计算机网络、内联网和因特网中很普遍。
用于LAN联网环境中,个人计算机110通过网络接口或适配器170连接到LAN 171。用于WAN联网环境中,计算机110通常包括调制解调器172或对在WAN 173例如,因特网建立通信用的其他装置。调制解调器172可能是内置的,也可能是外置的,可经用户输入接口160或其他合适机制连接到系统总线121。在联网环境中,相对于个人计算机110描绘的程序模块或其各个部分存储在远程存储器存储设备中。举例来讲且不作限制,图1将远程应用程序185展示为驻留在内存181上。将会理解:所示的这些网络连接起示范的作用,还可以使用其他装置在这些计算机之间建立通信链路。
在下文中,除非另有指示,将参照由一台或多台计算机完成的动作和操作的符号表示,来描述本发明。照此,将会理解:这类动作和操作有时被称作“是计算机执行的”包括用结构化形式来表示数据的电信号计算机的处理单元所执行的操作。这项操作变换该数据,或将其保存在该计算机的系统内存中位置,这样,按精通该技术领域的人所熟悉的方式来重新配置或改变该计算机操作。保存数据的这些数据结构是具有该数据的格式所定义特性的、内存的物理位置。但是,在前述上下文中本发明描述,这并不意味着起限制的作用,因为精通该技术领域的人将会理解:也可以用硬件实施下文中所描述的各种动作和操作。
如前所述,利用本发明,可以使用XML来访问NET构架的CLR中的可扩展类。虽然未作要求,但是,简单回顾NET构架可能有益于更好理解本发明所提供的各种好处。回到图2,采用最简单表示的.NET构架200包括CLR 202构架类库204、用户界面206以及web服务和应用程序208。该.NET构架驻留在机器的操作系统,例如,操作系统134。
用户界面206以及web服务和应用程序208提供包括文件访问、XML支持和服务的一般输入/输出。它们揭露了从HTTP到HTML的web技术和服务,提供了用于建立Web网页和/或传统的基于“窗口”的用户界面的用户界面元素,并揭露了ASP.NET和许多其他的服务。
CLR 202负责管理内存、启动和停止线程和进程,以及实施安全政策。它提供一种普通类型的系统,该系统提供数据类型与编程语言无关的概念,这样,允许众多的编程语言共享该.NET构架中的数据和代码。CLR 202也具有及时编译器,翻译MSIL(微软中间语言)码,并且为指定机器进行优化,以便自然地在该机器的系统处理器上。
该构架类库包括类。类定义对象可完成的操作(方法、事件或属性),并且定义保持对象状态的值(字段)。虽然类通常包括定义和实施,但是,可以有一个或多个成员无实施。普通类型的系统定义在运行时如何陈述、使用和管理类型。NET构架类型使用暗示层级的点句法命名方案。这项技术将相关类型归类于名字空间,所以,可以更容易地对它们进行搜索和参照。全名的第一部分,直到最右边的点,是名字空间的名字。名字的最后一部分是类型名字。例如,System.Collections.ArrayList表示ArrayList类型,它属于System.Collections名字空间。可以使用System.Collections中的类型处理对象集合。当用这种方法来组织类时,容易理解名字空间服务的目的和它将包含哪类功能。例如,System.Web.Services传达,这些类将提供几种Web功能的服务。同样,容易推断出:System.Windows.Shapes提供形状服务。除容易辨认的统一类中的逻辑分类外,名字空间也具有可扩展性,用户可以从现存的一个名字空间中导出自己的名字空间。例如,System.Web.UI.ACMECorp可以从System.Web.UI中导出,并可提供自定义UI元素。构架名字空间提供制定和执行解决方案所需要的“系统”或基本功能以及服务。
在下文中,将使用xaml命名法来描述本发明,以便将本发明的各个特点与XML区分开来。现在参考图3,本发明提供了CLR概念300到XML 310的直接映射。用所谓“反射”的CLR概念,可经由xmlns陈述312找到名字空间302。类304直接映射到XML标签314。性质306和事件308直接映射到属性316。用映射,用户可以指定XML标识文件中的任何CLR对象的层次树。
Xaml文件是具有.xaml扩展名和/xaml+xml应用介质类型的xml文件。Xaml文件具有一个根标签,指定xmlns属性名字空间。不需要特殊的根标签,从而允许用户用不同的CLR相关标签,作为根。可以用其他类型的标签指定名字空间。
用默认的一组名字空间。在一个实施例中,用五个名字空间。这些名字空间是System.Windows(有元素类)、System.Windows.Controls(有控制元素,例如,按钮、屏面、文本屏面等的类)、System.windows.Documents(有文档中央文本元素的类)、System.Windows.Shapes(有视窗口矢量图形元素的类)和System.Windows.Controls.Atoms(有构件块元素,例如,滚动观察器的类),并且,用xmlns陈述指定它们。可以使用其他名字空间,而该默认组是应用程序配置的。
如前所述,xaml文件中的标签通常映射到CLR对象。标签可以是元素、复合性质、定义或资源。元素是CLR对象,这些CLR对象通常在运行时间期间被例示,并且构成对象层次。这些元素保留在该层次中。有些元素只有当需要时,才例示。按与NET构架一致的方法来大写元素。在一个实施例中,有五个主元素组。它们是“屏面”、“控制”、“文档”、“形状”和“装饰”。用屏面定义如何在页面上安排这些元素。屏面的例子包括文本屏面(TextPanel)、船坞屏面(DockPanel)、画布(Canvas)、流动屏面(FlowPanel)和表格(Table)。控制提供交互经历。控制器的例子包括按钮(Button)、单选按钮(RadioBatton)和列表框(CistBox)。文档用来提出并格式化流文本。这些元素可以放在能包含其他元素的任何元素内部。“文档”的例子是段落(Sectiow)、章节(Paragrath)、粗体(Ellipse)和斜体(Halic)。形状是矢量图形(VcetorGmphics)元素。形状的例子包括椭圆(Ellipse)、直线路(Cine)和路径(Path)。装饰器类似于屏面元素除了它们只能有一个子元素外。装饰的例子包括边缘和(Border)发光(Glow)。
用复合性质标签设置父标签性质,以下将更加详细地对其加以讨论。在运行时期间,复合性质标签不像元素在层次树中。用定义标签将代码加入页面并定义资源。这些定义标签在xaml页面中或在xaml页面的一个成分中为<def:xyz>,其中,xyz是被定义的项目。例如,使用<def:Code>将代码加入页面,并且,<def:Resources>定义一个或多个可重用资源。出现在<def:Resources>标签内的标签可以映射到任何元素或任何任意的CLR对象。该资源标签提供了一种重用对象树的能力只要该树被指定为资源。定义标签也可以在另一个标签内定义为xmlns属性。
如前所述,属性映射到与类关联的性质和事件。一些属性不与实CLR类关联,所以,也用定义标签来将这些属性与映射到性质或事件的属性区分开来。以下表格列出这些属性。
属性 |
说明 |
值类型 |
可接受的值 |
def:Language |
指定用来编译代码的语言。这是XAML文件的根标签的属性。 |
字符串 |
C#VBC++JScriptJ#或其他语言 |
def:Class |
在标识子类定义中指定子类的名称。 |
字符串 |
只是一个类名,或一个名字空间和一个类名。 |
既然已描述了基本名字空间到xmlns属性、类名称到标签名称以及性质与事件到属性的映射和定义的属性,则将描述本发明在分析xaml文件的过程中所采用的各个步骤。本发明的分析程序,此后将称作xaml分析程序,根据CLR汇编的和能搜索到的名字空间根标签确定要找到一个标签。示范的根标签有以下形式:
<TextPanel xmlns="http://microsoft.com/xaml/2004/">
Hello World
</TextPanel>
xaml分析程序在xmlns属性所指定的URL目录中寻找一个名字空间定义文件。例如,在以上示范的根标签中,xaml分析程序将在http://microsoft.com/xaml/2004/xmlns.definition处搜索定义文件。
在该名字空间定义不在xmlns位置的情况下,在一个实施例中使用<?Mapping?>标签。作为汇编中的用户组分,标签有以下形式:
<?Mapping xmlns="foo"Namespace="ACME.Widgets"Assembly="acme"?>
关于xmlns指向由另一个实体(例如,w3c.org)(其中,用户提供执行)控制的站点的名字空间,标签有以下形式:
<?Mapping xmlns="http://www.w3c.org/2000/svg"
xmlnsdefinition="http://www.acme.com/svg/2000/xmlns.definition?>
也可以使用形式xmlns:foo=http://www.ACME/foo来指定名字空间,定义名字空间“foo”。如前所述,也可以用其他类型的标签指定名字空间。例如,用以下MyCoolButton标签指定名字空间。
<TextPanel xmlns="http://microsoft.com/xaml/2005"xmlns:def="Definition"
xmlns:Language="C#">
<MyCoolButton xmlns="http://Acme.Com/MyControls/2005">
</MyCoolButton>
</TextPanel>
名字空间定义文件提供了汇编及其安装路径的名称,以及CLR名字空间清单。示范的定义文件如下:
<Xmlns Name="Microsoft Xaml 2005">
<Schema Uri="http://microsoft.com/xaml/2005/xaml2005.xsd"/>
<Assembly Name="System.Windows"Version="1.0.0.0"/>
<Assembly Name="System.Windows.Foo"Version="1.0.0.0"/>
<ClrNamespace Name="System.Windows"/>
<ClrNamespace Name="System.Windows.Controls"/>
<ClrNamespace Name="System.Windows.Documents"/>
<ClrNamespace Nane="System.Windows.Shapes"/>
</Xmlns>
当xaml分析程序遇到新的xmlns定义文件时,读取该定义文件,并本地存储。
当分析程序遇到一个标签时,就使用标签的xmlns和它的xmlns定义文件确定标签归哪个CLR类。例如,如果标签是<Text xmlns="…">,则分析程序在定义文件提供的名字空间内搜索text。分析程序按在定义文件中指定汇编和名字空间的顺序来进行搜索。当分析程序找到一个匹配时,它例示一个该类的对象。
用两种方法中的一种方法来使用xaml标签中的属性。它要么设置一种性质,要么是挂接一事件处理程序。例如,xaml分析程序将下列标签。
<Button Text="OK"Background="Red"Click="RunHandler"ID="b1">
解释为Button类有文本、背景和点击性质和/或事件。该分析程序在Button类的性质段中搜索文本、背景和点击名称。如果名称不在性质段中,则分析程序到事件段中寻找该名称。
在以上例子中,分析程序确定Text和Background是性质,而Click是事件。文本字符串OK是设置。对于比设置文本字符串更加复杂的性质和事件,用CLR类型的转换器创建进行字符串与性质、事件之间的一个对象转换。例如,性质Background确定是Paint类的CLR类型。用Paint害的CLR类型转换器,将字符串Red转换成Paint类的对象。字符串设置为Button背景颜色的值。同样,该Click事件联上RunHandler方法,以及ID性质设置为b1。
性质可设置为简单属性、而具有串值的复合性质或具有对象的复合性质设置为值。简单属性采用形式<Button Background="Blue"/>。在这种情况下,“Blue” 解释为调用将字符串转换成Paint类对象的类型转换器Background性质的类型)。然后,应该设置Button的Background性质的值。如果属性值以*开始,则该属性不是文字值,而设置这个值等于新近例示的对象或现存对象。
具有字符串值的复合性质有下列形式:
<Button>
<Button.Background>Blue</Button.Background>
</Button>
其中有句点的标签指出该标签是对性质的参照。当分析程序看见一个标签,以父标签的标签名开头其后跟有句点(例如,“Button.Background”标签中的“Button.”)时,则搜索句点后名称(例如,“Button.Background”标签中的“Background”)的性质。在这种情况下,调用“Blue”解释为将字符串转换成Paint类(Background性质类型)对象的类型转换器。然后,应该将它设置为Batton的Background性质的值。
也可以在标签中陈述另一类的性质。例如,
标签<TextBox Button.Background="Blue">
指出:属性Button.Background映射到不同于TextBox类的类。分析程序看见句点,搜索该句点前面的名称(例如,“Button”)所指定的那类中、由句点后面的名称(例如,“Button.Background”中的“Background”)指定的性质。
具有作为值的对象的复合性质有以下形式:
<Button>
<Button.Background>
<HorizontalGradient StartColoF"Blue"EndColor="White"/>
</Button.Background>
</Button>
在这种情况下,创建CLR HorizontalGradient对象,然后将其设置为Button的Backruound性质的值。
可以使用复合性质句法不仅仅提供该值的对象。例如,可以实行动画制作或与一些数据的结合(Bind):
<Button>
<Background>
<ColorAnimation FromColor="Blue"ToColor="White"Duration="2"/>
</Background>
<Text>
<Bind DataSource="*Resources.Customers"Path="LastName"/>
</Text>
</Button>
在这些情况下,用标签使Animation或Bind有能力:建立提供特征的系统。例如,在创建Animation对象之后,xaml分析程序询问该对象,以了解它是否实施过被称作“IApplyValue”的界面。如果执行过,则xaml分析程序调用ColorAnimationObject.ApplyValue(elementReference,BackgroundPropertyID)。然后,ColorAnimationObject将联上动画制作。如果对象不支持该界面,则xaml分析程序将该Button的该Background性质设置为ColorAnimationObject。
如前所述,如果该属性值以*开始,则属性值设置成等同于新近例示的对象或现存对象的值。xaml分析程序寻找*后面的名称,并且寻找*后面名称的一个CLR类型。例如,利用<Button Background="*HorizontalGradient(Start=Red End=Blue)">标签,分析程序确定括号前面的那个名称(即HorizontalGradient),并且搜索由前述xmlns设置建立当前名字空间中的CLR类型。分析程序将该括号后面的这些项目视作属性和值(例如,start是属性,red是属性值)。以下是使用“*”扩展符的其他例子。在所有这些情况中,该值将被一次设定。不设置表达式或联编,以维持性质与某个对象之间的关系。允许向前参照。在树形结构创建期间,如果所参照的对象还不存在,则延迟那个性质的设置,直到参照对象存在,或者树完全创建为止。
<DockPanel ID="root"Background="Blue">
<def:Resources>
<HorizontalGradient def:Resource="hg1"StartColor="Blue"EndColor="White"/>
</def:Resources>
<!--Reference to an another element-->
<HyperLink Target="*frm1">Link</HyperLink>
<Frame ID="frm1"/>
<!--Reference to a property on another element-->
<FlowPanel Background="*root.Background"/>
<!--Reference to a page level resource-both are equivalent since root is"this"-->
<FlowPanel Background="*Resources.hg1">
<FlowPanel Background="*root.Resources.hg1"/>
<!--Reference to the Application object-both are equivalent since root is"this"-->
<FlowPanel Property="*App"/>
<FlowPanel Property="*root.App"/>
<!--Reference to a property on the application object-->
<FlowPanel Property="*App.Foo"/>
<!--Reference to an application level resource-->
<FlowPanel Property="*App.Resources.Foo"/>
</DockPanel>
编程语言可以与两个地方的.xaml页面关联。这些地方是.xaml文件和相关联的码后(code-behind)文件。码后文件的命名通常与该.xaml文件相同,只是添加编程语言的典型扩展名附于末端。例如,C#使用.xaml.cs,VB使用.xaml.vb,Jscript使用.xaml.js。将xmlns:def="Definition"的名字空间加入根元素,以便使用将代码加入页面所需要的这些标签。用户通过将def:Language属性加入页面的根元素,选择与xaml页面关联的编程语言。例如,以下标签表现了如何将定义和语言属性加入根元素:<DockPanelxmlns="http://microsoft.com/xaml/2005"xmlns"def="Definition"xmlns:Language="C#">。
为了将代码加入包含“>”、“<”和/或“&”字符的xaml文件内,<def:Code>段中需要如XML中所定义的CDATA段。这样的例子如下所示(注意:在这个例子中,不需要该CDATA括弧,因为所包含的代码不使用“<”、“>”或“&”字符):
<TextPanel xmlns="http://microsoft.com/xaml/2005"xmlns:def="Definition"
xmlns:Language="C#">
<Button ID="buttonl"Click="clicked">Press this</Button>
<def:Code><![CDATA[
void clicked(Element target,ClickEventArgs args)
{
buttonl.Text="Hello World";
}
]]></def:Code>
</TextPanel>
为了在码边(code-beside)文件中指定代码,要源属性。源属性将URI提供给xaml文件码后。URI可以是相对的,也可以是绝对的。指定URI和简单的码边文件的例子如下所示:
<TextPanel xmlns="http://microsoft.com/xaml/2005"xmlns:def="Definition"
xmlns:Language="C#">
<Button ID="buttonl"Click="clicked">Press this</Button>
<def:Code Source="Simple.xaml.cs"/>
</TextPanel>
The simple code-beside file is below:
Simple.xaml.cs
namespace MyApp{
using System;
using System.Windows;
//more usings here
partial class Simple:Page{
void clicked(Object target,ClickEventArgs args)
{
buttonl.Text="Hello World";
}
}
}
xaml分析程序也支持所谓IliteralContent特征。对于实施IliteralContent的对象,xaml分析程序将该对象的标签视作字符串,并且不对该标签进行分析。例如,如果Public类FooObject实施IliteralContent,那么,只要xaml分析程序遇到标签<FooObject>"I am a string"</FooObject>,则分析程序就创建FooObject的实例,并将该<FooObject>标签内的数据(例如,"I am a string")传递给新近创建的FooObject。
总之,当分析由元素/对象直接包含的这一个或多个根标签时,使用以下规则。参考图4,如果标签具有指定模式定位的xmlns属性,则就能找到有与xmlns属性关联的汇编/名字空间的定义文件并存储在本地(步骤400)。通常使用文档的根标签中或映射标签中的模式URL找到汇编/名字空间。如果标签是元素标签,则分析程序根据被元素指定的xml名字空间,查看该类的一组汇编/名字空间并例示该类的一个对象(步骤402)。如果没有找到类名,则xaml分析程序进行检验,以了解包含的父类是否具有该名的性质。如果它是该包含元素的性质,则xaml分析程序用复合性质规则分析该标签的内容。如果该标签是属性标签,则设置与该属性关联的性质或事件(步骤404)。如果该属性值以*开始,则该属性不是指定文字值,而是设置等同于新近例示的对象或现存对象的那个值。标签可以具有被用来在父标签上设置性质的标签。该标签是复合性质。如果该标签是复合性质,则遵循复合规则(步骤406)。这些规则如下。xaml分析程序确定复合性质是否是字符串。如果内容是字符串,则xaml分析程序为正在加以设置的该性质的合适类型调用类型转换器。如果父标签的内容是另一个标签,那么,xaml分析程序将例示该对象为“正常”。在例示该对象之后,xaml分析程序将它设置为该父对象上的性质值。如果标签的xmlns是“def:”,则xaml分析程序使用如下所述的一组内部含义(步骤408)。分析文件中的下一个标签(步骤410),并且,为每个标签重复步骤400~408,直到xaml分析程序检测到xaml文件的末端根标签。
从前文中可见,本发明提供了一种机制,该机制通过使用基于标识标签文件的XML表现对象模型。可以将对象模型表现为标识标签,来创建矢量图形、固定格式文档、适应流文档和应用程序UI。可以异步或同步地创建这些矢量图形、固定格式文档、适应流动文档和应用程序UI。这提供了一个好处,建立这些项目树,可以从标识到对象树。
固定格式文档按预定的、与设备无关的方式明确地定义文档页面的数量和尺寸,以及每页上的对象的布置。这为用户提供了创建和共享采用一种呈现相同页面格式的文档的能力,不管被用来观看该文档的实施系统。在一个实施例中,固定格式文档的这些根标签之一是<FixedPanel>,并且使用<FixedPage>标签来指定页面。在固定的页面内,可以使用几种类型的元素。这些元素包括文本、矢量图形和图像。指定外部资源例如,字体和共享的图像。用于文本的标签为该用户提供对单个的字符雕刻及其布置的精确控制。额外的标签为该用户提供对文本、矢量图形和图像在页面上的组合方式的控制。xaml分析程序为固定格式文档辨认标签。关于任何其他类型的.xaml文件,分析程序确定与这些标签关联的CLR名字空间和类,为xaml文件内的标签调用类型转换器,并且呈现固定格式文档。
适应流文档没有预定的页面大小。适应流文档中的文本、图像、DocumentElements和其他对象的集合可以流动,或者在该页面上重定位置,以便适应变化的页宽。例如,该显示屏幕上的窗口中所呈现的页面在不同的显示屏幕上可能会有不同的宽度,这取决于所使用的计算系统或取决于用户的喜好。打印页面将根据打印纸大小而具有不同的宽度。例如,如果该页面宽度较窄,则文本各行将具有较短的长度,从而使文本流动或按从文本行到文本行的串联顺序、将额外的单词重定位到该页更下面的各行上。使用属性来指定用户对适应流文档的出现方式的喜好。
xaml分析程序将这些属性传递给对象的CLR类型转换器,以创建文档。对象可以创建没页标的或有标页的描述。没页标的描述具有借助于控制器例如,垂直滚动条,在该显示屏幕上观看的单一无底页面。有页标的描述根据页面高度来将该文档内容分割成各段,并且分别显示每页,借助于控制器,例如,上页、下页按钮,在显示屏幕上观看的每个页面。另外的属性确定页面上的宽度和列数,关于所有文本元素的大小、文本行间距、所有图像或图表的尺寸和位置,以及页边空白和装订线的宽度。用户也可以经由属性来指定创建该文档的这些对象是否应该自动调整列、文本大小和行间距、图像尺寸和布置、页边空白和装订线以及其他页面或文本参数,以获得页面大小的最佳可读性。xaml分析程序分析适应流文档标签,确定与该标签关联的CLR名字空间和类,并且为提交适应流文档调用xaml文件所指定对象的类型转换器。
鉴于可以应用本发明原理的,许多可能的实施例,应该认识到:这里根据这些附图而描述的该实施例意在只起说明性作用,而不应该被视作于本发明的范围。例如,精通该技术领域的人将会认识到:说明性实施例用软件所示的的各个元件,亦可以用硬件执行,反之亦然;或者,在不脱离本发明的精神的前提下,可以在排列和细节方面修改这个说明性实施例。所以,如这里所描述的本发明计划可将所有这类实施例纳入以下权利要求书及其等价物的范围以内。