XAML学习文档_第1页
XAML学习文档_第2页
XAML学习文档_第3页
XAML学习文档_第4页
XAML学习文档_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Xaml 概述(wpf)发送反馈本主题介绍XAML语言的功能,并演示如何使用XAML编写 Windows PresentationFoundation (WPF)应用程序。本主题专门介绍WPF实现的 XAML。XAML本身是一个比WPF大的语言概念。本主题包括下列各节。 什么是XAML ? XAML语法概述 XAML中的大小写和空白 标记扩展 类型转换器 XAML 根元素和 XAML 命名空间 XAML中的自定义前缀和自定义类型 事件和XAML代码隐藏 XAML命名元素 附加属性和附加事件 基类型和XAML XAML安全性 从代码中加载XAML 接下来的内容, 相关主题什么是XAML ?XAM

2、L是一种声明性标记语言。如同应用于 .NET Framework编程模型一样,XAML简化了为.NET Framework应用程序创 建UI的过程。您可以在声明性 XAML标记中创建可见的 UI元素,然后使用代码隐藏文件(通过分部类定义与标记相连接) 将UI定义与运行时逻辑相分离。XAML直接以程序集中定义的一组特定后备类型表示对象的实例化。这与大多数其他标记语言不同,后者通常是与后备类型系统没有此类直接关系的解释语言。XAML实现了一个工作流,通过此工作流,各方可以采用不同的工具来处理应用程序的 UI和逻辑。以文本表示时,XAML文件是通常具有.xaml扩展名的XML文件。可通过任何 XML

3、编码对文件进行编码,但通常编码为UTF-8。下面的示例演示如何创建作为 UI 一部分的按钮。此示例的目的仅在于供您初步了解XAML是如何表示常用 UI编程形式的(它不是一个完整的示例)。XAML<StackPanel><Button Content= "Click Me" /> </StackPanel>XAML语法概述下面的章节介绍 XAML语法的基本形式,并提供一个简短的标记示例。这些章节并不提供每个语法形式的完整信息,例如这 些语法如何在后备类型系统中表示。有关本主题中介绍的每种语法形式在XAML语法中的详情的更多信息,请参见XAM

4、L语法详述。如果您以前熟悉XML语言,则下面几节中的很多材料对您而言都是基础知识。这是XAML的其中一个基本设计原则的结果。XAML语言定义它自己的概念,但这些概念在 XML语言和标记形式内发挥作用。XAML对象元素对象元素通常声明类型的实例。该类型在为以XAML为语言的技术提供后备类型的程序集中定义。对象元素语法始终以左尖括号 (<)开头,后跟要创建实例的类型的名称。(该名称可能包含前缀,前缀的概念会在后面解释。) 在此之后,您可以选择声明该对象元素的特性。要完成对象元素标记,请以右尖括号(>)结尾。您也可以使用不含任何内容的自结束形式,方法是用一个正斜杠后接一个右尖括号(/&g

5、t;)来完成标记。例如,请再次查看前面演示的标记代码段:XAML打印<StackPanel><Button Content= "Click Me" /></StackPanel>此示例指定了两个对象元素:<StackPanel>(含有内容,后面有一个结束标记)和 Button ./>(自结束形式,包含几个特性)。 对象元素StackPanel 和Button 各映射到一个类名,这些类由 WPF定义并且是 WPF程序集的一部分。 指定 对象元素标记时会创建一条 XAML处理指令来创建一个新实例。每个实例都是在分析和加载XA

6、ML时通过调用基础类型的默认构造函数来创建的。特性语法(届性)对象的属性通常可表示为对象元素的特性。特性语法命名在特性语法中设置的属性,后跟赋值运算符(=)。特性的值始终以包含在引号中的字符串的形式进行指定。特性语法是最简单有效的属性设置语法,并且对于曾使用过标记语言的开发人员而言在使用中是最直观的语法。例如,以下标 记将创建一个具有红色文本和蓝色背景的按钮,还将创建指定为Content 的显示文本。XAML打印<Button Background= "Blue" Foreground= "Red" Content= "This is a

7、 button" />届性元素语法对于对象元素的某些属性,特性语法是不可能实现的,因为无法在特性语法的引号和字符串限制内充分地表达提供属性值所必 需的对象或信息。对于这些情况,可以使用另一个语法,即属性元素语法。属性元素开始标记的语法为 类型名称.属性名称。通常,该标记的内容是类型的一个对象元素,属性会将该元素作为其值。指定内容之后,必须用一个结束标记结束属性元素。结束标记的语法为</类型名称.属性名称>。如果可以使用特性语法,那么使用特性语法通常更为方便,且能够实现更为精简的标记,但这通常只是一个风格的问题,而不属于技术限制。下面的示例演示了在前面的特性语法示例中

8、设置的相同属性,但这次对Button的所有属性使用了属性元素语法。XAML打印<Button><Button.Background><SolidColorBrush Color="Blue" /></Button.Background><Button.Foreground><SolidColorBrush Color="Red" /></Button.Foreground><Button.Content>This is a button</Button.

9、Content></Button>集合语法XAML语言包含一些优化,可以生成可读性更好的标记。其中的一项优化是:如果某个特定属性采用集合类型,则您在标记中 声明为该属性的值内的子元素的项将成为集合的一部分。在这种情况下,子对象元素的集合是设置为集合属性的值。下面的示例演示为GradientStops属性设置值的集合语法:XAML打印<LinearGradientBrush><LinearGradientBrush.GradientStops><!- no explicit new GradientStopCollection,parser kno

10、wshow to find or create -><GradientStop Offset="0.0"Color="Red" /><GradientStop Offset="1.0"Color="Blue" /></LinearGradientBrush.GradientStops> </LinearGradientBrush>XAML内容届性XAML指定了一个语言功能,通过该功能,一个类可以指定它的一个且仅一个属性为XAML内容属性。该对象元素的子元素用于设

11、置该内容属性的值。换言之,仅对内容属性而言,您可以在XAML标记中设置该属性时省略属性元素,并在标记中生成更直观的父级/子级形式。例如,Border指定内容属性Child。系统处理下面两个Border元素的方式相同。 第一个元素利用了内容属性语法而省略 了 Border.Child属性元素。第二个元素显式标明 Border.Child。XAMLI打印<Border><TextBox Width= "300" /></Border><!-explicit equivalent-><Border><Border.

12、Child><TextBox Width= "300" /></Border.Child></Border>作为XAML语言的规则,XAML内容属性的值必须完全在该对象元素的其他任何属性元素之前或之后指定。例如,下面的标记无法进行编译:打印<Button >I am a<Button.Background >Blue </ Button.Background > blue button </ Button >有关XAML内容属性的此项限制的更多信息,请参见 XAML语法详述的“XAML

13、内容属性”一节。文本内容有少量XAML元素可直接将文本作为其内容来处理。若要实现此功能,必须满足以下条件之一: 类必须声明一个内容属性,并且该内容属性必须是可赋值给字符串的类型(该类型可以是Object)。例如,任何ContentControl都将Content用作其内容属性,并且其类型为 Object,这样就支持实际的 ContentControl (例 如,Button)上的如下用法: <Button>Hello</Button> 。 类型必须声明一个类型转换器,该类型转换器将文本内容用作其初始化文本。例如, <Brush>Blue</Brush&

14、gt; 。这 种情况实际上并不常见。 类型必须为已知的 XAML语言基元。内容届性和集合语法组合请看以下示例:XAML打印<StackPanel><Button>First Button</Button><Button>Second Button</Button></StackPanel>此例中,每个Button都是StackPanel的一个子元素。 这是一个简单直观的标记,其中出于两个不同的原因省略了两个标记。省略的 StackPanel.Children 属性元素:StackPanel从 Panel派生。Panel将

15、Panel .Children 定义为其 XAML 内容属 性。 省略的 UIElementCollection 对象元素:Panel .Children 属性采用类型 UlElementCollection,该类型实现 IList。根据 处理集合(例如IList)的XAML规则,集合的元素标记可以省略。(在这种情况下,UIElementCollection实际无法实例化,因为它没有公开默认构造函数,这就是UIElementCollection对象元素以注释形式出现的原因。)XAML打印<StackPanel><StackPanel.Children><!-<

16、;UIElementCollection>-><Button>First Button</Button><Button>Second Button</Button><!-</UIElementCollection>-></StackPanel.Children> </StackPanel> 特性语法(事件)特性语法还可用于事件成员,而不仅限于属性成员。在这种情况下,特性的名称为事件的名称。在XAML事件的 WPF实现中,特性的值是实现该事件的委托的处理程序的名称。例如,以下标记将Clic

17、k事件的一个处理程序指定给在标记中创建的 Button :XAML打印<Pagexmlns= " ntation"xmlns:x= " x:Class= "ExampleNamespace.ExamplePage" > <Button Click= "Button_Click" >Click Me!</Button></Page>除此特性语法示例外,还有更多关于WPF中的事件和XAML的内容。例如,您可能希望了解此处引用的 ClickHandler 表示什么,以及它是如何定义的

18、。 这将在本主题中后面的事件和XAML代码隐藏一节中解释。XAML 中的大小写和空白XAML通常区分大小写。出于解析后备类型的目的,WPF XAML按照CLR区分大小写的相同规则区分大小写。按名称与程序集中的基础类型进行比较或者与类型的成员进行比较时,对象元素、属性元素和特性名称均必须使用区分大小写的形式指定。XAML语言关键字和基元也区分大小写。值并不总是区分大小写。值是否区分大小写将取决于与采用该值的属性关联的类型转 换器行为,或取决于属性值类型。例如,采用Boolean类型的属性可以采用true或True作为等效值,但只是因为将字符串转换为Boolean的本机 WPF XAML分析器类型

19、转换已经允许将这些值作为等效值。WPF XAML处理器和序列化程序将忽略或删除所有无意义的空白,并规范化任何有意义的空白。 这与XAML规范的默认空白行为建议一致。通常,只有当您在XAML内容属性中指定字符串时,此行为的重要性才会体现出来。简言之,XAML将空格、 换行符和制表符转化为空格,如果它们出现在一个连续字符串的任一端,则保留一个空格。有关XAML空白处理的完整说明标记扩展标记扩展是一个 XAML语言概念。当用于提供特性语法的值时,大括号(和)表示标记扩展用法。 此用法指示XAML处理系统不要像通常那样将特性值视为一个文本字符串或者可转换为字符串的值。WPF应用程序编程中最常用的标记扩

20、展是 Binding (用于数据绑定表达式) 以及资源引用StaticResource和DynamicResource。通 过使用标记扩展,即使属性通常不支持特性语法,也可以使用特性语法为属性提供值。标记扩展经常使用中间表达式类型实现 一些功能,例如,推迟值或引用仅在运行时才存在的其他对象。例如,下面的标记使用特性语法设置 Style属性的值。Style属性采用了 Style类的一个实例,该实例默认情况下未能用特性语法 字符串实例化。但在本例中,特性引用了特定的标记扩展 StaticResource当处理该标记扩展时,它返回对以前在资源字典中作 为键控资源进行实例化的某个样式的引用。XAML打

21、印<Page.Resources><SolidColorBrush x:Key="MyBrush" Color= "Gold" /><Style TargetType= "Border" x:Key= "PageBackground" ><Setter Property -"Background" Value= "Blue" /></Style></Page.Resources><StackPane

22、l><Border Style- "StaticResource PageBackground"></Border></StackPanel>有关特定在 WPF中实现的所有 XAML标记扩展的参考列表,请参见WPF XAML扩展。有关由System.Xaml定义并且可更 广泛用于.NET XAML 实现的标记扩展的参考列表,请参见 XAML命名空间(x:)语言功能。有关标记扩展概念的更多信息, 请参见标记扩展和 WPF XAML。类型转换器在特性语法一节中,曾提到特性值必须能够使用字符串进行设置。对字符串如何转换为其他对象类型或基元

23、值的基本本机处理取决于String类型本身,以及对某些类型(如 DateTime或里)的本机处理。 但是很多 WPF类型或这些类型的成员扩展了基 本字符串特性处理行为,因此可以指定更复杂的对象类型的实例作为字符串和特性。Thickness结构是一个类型示例,该类型拥有可使用XAML的类型转换。Thickness指示嵌套矩形中的度量并用作一些属性(如Margin )的值。通过对Thickness设置类型转换器,所有使用 Thickness的属性都可以更容易地在 XAML中指定,因为它 们可指定为特性。下面的示例使用类型转换和特性语法来为 Margin提供值:XAML打印<Button Ma

24、rgin= "10,20,10,30" Content= "Click me" />上面的特性语法示例与下面更为详细的语法示例等效,但在下面的示例中,Margin改为通过包含Thickness对象元素的属性元素语法进行设置。而且设置Thickness的四个关键属性作为新实例的特性:XAML打印<Button Content= "Click me" ><Button.Margin><Thickness Left= "10" Top= "20" Right= &q

25、uot;10" Bottom= "30" /> </Button.Margin></Button>孑说明还有少数对象只能通过类型转换这种公开方式在不涉及到子类的情况下为该类型设置属性,因为 类型本身并没有默认构造函数。一个示例是Cursor。有关如何支持类型转换及其在特性语法上的应用的更多信息,请参见TypeConverters和XAML。XAML根元素和XAML 命名空间一个XAML文件只能有一个根元素,这样才能同时成为格式正确的XML文件和有效的XAML文件。对于典型的 WPF方案,将使用在 WPF应用程序模型中具有重要意义的根元

26、素(例如,为页使用 Window或Page,为外部字典使用ResourceDictionary或为应用程序定义使用 Application )。下面的示例演示 WPF页的典型XAML文件的根元素,此根元素 为 PagaXAML打印<Pagexmlns= "ntation"xmlns:x= "</Page>根元素还包含特性xmlns和xmlns:x。这些特性向XAML处理器指明哪些XAML命名空间包含标记将要作为元素引用的后备 类型的类型定义。xmlns特性明确指示默认的 XAML命名空间。在默认的XAML命名空间中,可以不使用前缀指定标记中 的对

27、象元素。对于大多数 WPF应用程序方案以及 SDK的WPF部分中给出的几乎所有示例,默认的XAML命名空间均映射到为 WPF 命名空间 特性指示另外一个 XAML 命名空间, 该命名空间映射 XAML 语言命名空间 使用xmlns定义用法范围和名称范围映射的做法符合XML 1.0规范。XAML名称范围与XML名称范围的不同仅在于:XAML名称范围还包含有关进行类型解析和分析XAML时名称范围的元素如何受类型支持的信息。请注意,只有在每个 XAML文件的根元素上,xmlns特性才是绝对必需的。xmlns定义将适用于根元素的所有子代元素(此 行为也符合xmlns的XML 1.0规范。)同时允许根以

28、下的其他元素上具有 xmlns特性,这些特性将适用于定义元素的任何子代 元素。但是,频繁定义或重新定义 XAML命名空间可能会导致 XAML标记样式难以阅读。其XAML处理器的 WPF实现包括可识别 WPF核心程序集的基础结构。已知 WPF核心程序集包含支持 WPF到默认 XAML命名空间的映射的类型。这是通过属于项目生成文件以及WPF生成和项目系统一部分的配置来实现的。因此,为了引用来自WPF程序集的XAML元素,只需将默认 XAML命名空间声明为默认 xmlns。x:前缀在上面的根元素示例中,前缀x:用于映射 XAML 命名空间 ,该命名空间是支持XAML语言构造的专用 XAML命名空间。

29、在这整个SDK的项目模板、示例以及文档中,此 x:前缀用于映射该 XAML命 名空间。XAML语言的XAML命名空间包含多个将在 XAML中频繁用到的编程构造。下面列出了将用到的最常见的 x:前 缀编程构造: x:Key:为ResourceDictionary (或其他框架中的类似字典概念)中的每个资源设置唯一的键。在典型的 WPF应用程序标记中的所有x:用法中,x:Key将可能占到90%。 x:Class:向为XAML页提供代码隐藏的类指定 CLR命名空间和类名。必须具有这样一个类才能支持每个WPF编程模型的代码隐藏,而正是因此,即使没有资源,也几乎总是能看到映射的x:。 x:Name:处理

30、对象元素后、为运行时代码中存在的实例指定运行时对象名称。通常,您将为x:Name经常使用 WPF定义的等效属性。此类属性特定映射到 CLR后备属性,因此更便于进行应用程序编程,在应用程序编程中,您经常使用运行时代码从初始化的XAML中查找命名元素。最常见的此类属性是FrameworkElement .Name。在特定类型中不支持等效的 WPF框架级Name属性时,仍然可以使用 x:Name。某些动画方案中会发生这种情况。 x:Static:启用一个返回静态值的引用,该静态值只能是一个XAML兼容属性。 x:Type:根据类型名称构造一个 Type引用。它用于指定采用Type (例如Style

31、.TargetType )的特性,但属性经常具 有本机的字符串到Type的转换功能,因此使用x:Type标记扩展用法是可选的。x:前缀/XAML命名空间中还有其他一些不太常见的编程构造。有关详细信息,请参见 XAML命名空间(x:)语言功能。XAML中的自定义前缀和自定义类型对于您自己的自定义程序集或 PresentationCora PresentationFramework和 WindowsBase的 WPF核心以外的程序集,可以将 该程序集指定为自定义 xmlns映射的一部分。只要该类型能够正确地实现以支持您所尝试的XAML用法,就可以在XAML中引用该程序集中的类型。下面是一个说明自定

32、义前缀如何在 XAML标记中工作的基本示例。前缀 custom在根元素标记中定义,并映射为随应用程序 一同打包并可用于该应用程序的一个特定程序集。此程序集包含NumericUpDown 类型,实现该类型的目的是在支持常规XAML用法之外,还可以使用允许在 WPF XAML内容模型的此特定点执行插入的类继承。通过使用该前缀,此NumericUpDown 控件的一个实例声明为对象元素,以便 XAML分析器可找到包含该类型的 XAML命名空间,从而找到包 含该类型定义的后备程序集的位置。打印<Pagexmlns=" ntation"xmlns:x="xmlns:c

33、ustom="clr-namespace:NumericUpDownCustomControl;as sembly=CustomLibrary” ><StackPanel Name="LayoutRoot" ><custom:NumericUpDown Name="numericCtrl1" Width="100”Height="60" /> .</ StackPanel > </ Page >有关XAML 中自定义类型的更多信息,请参见 XAML 及 WPF的

34、自定义类。有关XML命名空间与程序集中后备代码的命名空间如何相关的更多信息,请参见WPF XAML的XAML命名空间和命名空间映射。事件和XAML 代码隐藏大多数 WPF应用程序既包括 XAML标记,也包括代码隐藏。在一个项目中, XAML编写为.xaml文件,而CLR语言(如 Microsoft Visual Basic .NET 或C#)用于编写代码隐藏文件。 在 WPF编程和应用程序模型中对 XAML文件进行标记编译时, XAML文件的XAML代码隐藏文件的位置是通过如下方式来标识的:以 XAML的根元素的x:Class特性形式指定一个命名 空间和类。在目前已介绍的示例中,您已看到几个按

35、钮,但还没有一个按钮具有任何关联的逻辑行为。为对象元素添加行为的主要应用程 序级机制是使用元素类的现有事件,并为在运行时引发该事件时调用的该事件编写特定的处理程序。事件名称以及要使用的处 理程序的名称在标记中指定,而实现处理程序的代码在代码隐藏中定义。XAML<Pagexmlns= " ntation"xmlns:x= " x:Class= "ExampleNamespace.ExamplePage" > <Button Click= "Button_Click" >Click Me!</But

36、ton></Page>VBC#C+F#JScript打印namespace ExampleNamespacepublic partial class ExamplePagevoid Button_Click(object sender, RoutedEventArgs e)Button b = e.Source as Button;b.Foreground = Brushes.Red; 请注意,代码隐藏文件使用 CLR命名空间ExampleNamespace 并将ExamplePage 声明为该命名空间内的一个分部类。这相当于在标记根中提供的 ExampleNamespace

37、 . ExamplePage 的x:Class特性值。WPF标记编译器将通过从根元素类型派生 一个类,为编译的任何 XAML文件创建一个分部类。当您提供也会定义同一分部类的代码隐藏时,将在与编译的应用程序相 同的命名空间和类中组合生成的代码。有关WPF中代码隐藏编程要求的更多信息,请参见 WPF中的代码隐藏和 XAML中的代码隐藏、事件处理程序和分部类要 求“一节。如果您不想创建一个单独的代码隐藏文件,还可以将代码内联到XAML文件中。但是,内联代码是一种缺少多样性的方法,有很多的限制。有关详细信息,请参见 WPF中的代码隐藏和 XAML。路由事件路由事件是一个特殊的事件功能,该功能是WPF的

38、基础。路由事件使一个元素可以处理另一个元素引发的事件,前提是这些元素通过树关系连接在一起。使用XAML特性指定事件处理时,可以对任何元素(包括未在类成员表中列出路由事件的元素) 侦听和处理该路由事件。这是通过以所属类名限定事件名特性来实现的。例如,在当前所讨论的StackPanel /Button 示例中,父StackPanel 可以通过在StackPanel 对象元素上指定特性Button.Click,并使用处理程序名作为特性值,为子元素按钮的Click事件洋册一个处理程序。 有关路由事件如何工作的更多信息,请参见 路由事件概述。XAML 命名元素默认情况下,通过处理 XAML对象元素在对象

39、图中创建的对象实例没有唯一标识符或对象引用。相反,如果在代码中调用构 造函数,则几乎总是使用构造函数结果为构造的实例设置一个变量,以便以后在代码中引用该实例。为了对通过标记定义创建 的对象提供标准化访问,XAML定义了 x:Name特性。您可以在任何对象元素上设置 x:Name特性的值。在代码隐藏中,您选 择的标识符等效于引用所构造的实例的实例变量。在任何方面,命名元素都像它们是对象实例一样工作(此名称引用该实例),并且代码隐藏可以引用该命名元素来处理应用程序内的运行时交互。实例和变量之间的这种连接是由WPF XAML标记编译器实现的,并且更具体涉及到功能和模式,例如本主题中将不详细讨论的In

40、itializeComponent。WPF框架级XAML元素继承Name属性,该属性等效于 XAML定义的x:Name特性。其他某些类也为x:Name (通常也定 义为Name属性)提供属性级等效项。一般而言,如果您在所选元素/类型的成员表中找不到 Name属性,则可以改用x:Name。x:Name值将通过特定子系统或通过诸如 FindName等实用工具方法,为可在运行时使用的XAML元素提供标识符。下面的示例在StackPanel元素上设置Name。然后,该StackPanel中的Button上的处理程序通过由 Name设置的实例引 用 buttonContainer来引用 StackPan

41、ekXAML打印<StackPanel Name= "buttonContainer" ><Button Click= "RemoveThis" >Click to remove this button</Button> </StackPanel>VBC#C+ F#JScript打印void RemoveThis(object sender, RoutedEventArgs e)FrameworkElement fe = e.Source as FrameworkElement;if (buttonCont

42、ainer.Children.Contains(fe)buttonContainer.Children.Remove(fe);就像变量一样,实例的 XAML名称受范围概念的控制,因此可以在可预测的某个范围内强制名称唯一。定义页面的主标记表 示一个唯一的 XAML名称范围,而该 XAML名称范围的边界就是该页面的根元素。但是,其他标记源(如样式或样式中的 模板)可以在运行时与页面交互,这种标记源常常具有自己的XAML名称范围,这些名称范围不一定与页面的XAML名称范围相关联。有关 x:Name和 XAML 名称范围的更多信息,请参见 Name、x:Name特性或WPF XAML 名称范围。附加属

43、性和附加事件XAML指定了一个语言功能,该功能允许对任何元素指定某些属性或事件,而不管要设置属性或事件的元素的类型定义中是否 存在该属性或事件。该功能的属性版本称为附加属性,事件版本称为附加事件。从概念上讲,可以将附加属性和附加事件视为 可以在任何XAML元素/对象实例上设置的全局成员。但是,元素 /类或更大的基础结构必须支持附加值的后备属性存储。通常通过特性语法来使用 XAML中的附加属性。在特性语法中,您可以采用所有者类型.属性名”的形式指定附加属性。表面上,这与属性元素用法类似,但在这种情况下,您指定的所有者类型”始终是一种与从中要设置附加属性的对象元素不同的类型。所有者类型”这种类型提

44、供XAML处理器为获取或设置附加属性值所需要的访问器方法。使用附加属性的最常见方案是使子元素能够向其父元素报告属性值。下面的示例演示了 DockPanel .Dock附加属性。DockPanel类为DockPanel .Dock定义访问器,因此拥有附加属性。 DockPanel类 还包括一个逻辑,该逻辑迭代其子元素并具体检查每个元素是否具有 DockPanel .Dock设置值。如果找到一个值,将在布局过程 中使用该值定位子元素。使用 DockPanel .Dock附加属性和这种定位功能事实上是 DockPanel类的激动人心的一面。XAML打印<DockPanel><But

45、ton DockPanel.Dock= "Left" Width= "100" Height= "20" >I am on the left</Button><Button DockPanel.Dock= "Right" Width= "100" Height= "20" >I am on the right</Button> </DockPanel>在 WPF中,大部分或所有附加属性还作为依赖项属性来实现。有关详细信息,

46、请参见附加属性概述。附加事件使用类似的所有者类型.事件名”特性语法形式。就像非附加事件一样,XAML中的附加事件的特性值指定对元素处 理事件时调用的处理程序方法的名称。在WPF XAML中使用附加事件并不常见。有关更多信息,请参见 附加事件概述。基类型和XAML基础WPF XAML及其XAML命名空间是类型的一个集合,这些类型对应于CLR对象以及XAML的标记元素。但是,并不是所有的类都能映射到元素。 抽象类(如ButtonBase)和某些非抽象基类在 CLR对象模型中用于继承。 基类(包括抽象类) 对于XAML开发仍然很重要,因为每个具体的XAML元素都从其层次结构中的某个基类继承成员。通常

47、,这些成员包括可以设置为元素特性的属性或者可以处理的事件。FrameworkElement是 WPF在 WPF框架级的具体 UI基类。设计UI时,您将使用各种形状、面板、修饰器或控件类,它们全部从FrameworkElement派生而来。有一个相关的基类 FrameworkContentElement, 它使用可在FrameworkElement中特意镜像 API的API,支持适合流布局表示形式的面向文档的元素。元素级的特性和 CLR对象模型的组合提供了一组通用的属性,这些属性可以在大多数具体的XAML元素上设置,而不管具体的 XAML元素类型及其基础类型是什么。XAML 安全性XAML是一种

48、直接表示对象实例化和执行的标记语言。因此,在 XAML中创建的元素能够像等效的生成代码那样与系统资源 (如网络访问、文件系统 IO)进行交互。WPF支持,NET安全框架代码访问安全性(CAS)。这意味着在Internet区域中运行的 WPF内容具有更少的执行权限。”宽 松XAML (由XAML查看器在加载时解释的非编译 XAML的页面)和XAML浏览器应用程序(XBAP)通常在此Internet 区域中运行,并且使用相同的权限集。但是,加载到完全受信任的应用程序中的XAML与承载应用程序具有相同的系统资源访问权限。有关更多信息,请参见 WPF部分信任安全。从代码中加载 XAMLXAML可用于定

49、义整个 UI,但有时也适合在 XAML中定义UI的一部分。此功能可用于实现部分自定义,在本地存储信息, 使用XAML提供业务对象或者各种可能的方案。这些方案的关键是XamlReader类及其Load方法。输入是一个XAML文件, 而输出是一个对象,表示从该标记创建的整个运行时对象树。然后您可以插入该对象,作为应用程序中已存在的另一个对象的 属性。只要该属性在具有最终显示功能并且将通知执行引擎已向应用程序中添加新内容的内容模型中是一个合适的属性,就可 以通过载入XAML非常轻松地修改正在运行的应用程序的内容。请注意,通常只在完全受信任的应用程序中使用此功能,因 为将文件加载到正在运行的应用程序中

50、会带来明显的安全隐患。接下来的内容本主题简单介绍了适用于 WPF的XAML语法概念和术语。有关本文使用的术语的更多信息,请参见 XAML语法详述。如果尚未做过 WPF入门教程主题中的练习,请试做。当您创建该教程中介绍的以标记为中心的应用程序时,其中的练习将帮助您巩固本主题中介绍的许多概念。WPF使用一个特定的应用程序模型,该模型基于Application类。有关详细信息,请参见 应用程序管理概述。生成WPF应用程序(WPF)为您详细介绍了如何通过命令行以及使用Microsoft Visual Studio生成包含XAML的应用程序。依赖项属性概述详细介绍了 WPF中属性的多样性,并介绍了依赖项

51、属性的概念。请参见概念XAML语法详述XAML及WPF的自定义类基元素概述WPF中的树其他资源XAML命名空间(x:)语言功能WPF XAML 扩展Xaml语法详述发送反馈本主题定义用于描述 XAML语法中各个元素的术语。本文档的其余部分将经常用到这些术语,既特定适用于WPF文档,也适用于其他框架,这些框架使用由 System.Xaml级别的XAML语言支持实现的 XAML或基本XAML概念。本主题进一步 阐述主题 XAML 概述(WPF)中曾介绍过的基本术语。本主题包括下列各节。 XAML语言规范 XAML 和 CLR 对象元素语法 对象元素的属性 特性语法(属性) 属性元素语法 集合语法

52、XAML内容属性 内容属性和集合语法组合, XAML命名空间 标记扩展 附加属性 附加事件 XAML根元素剖析 可选的和不建议的 XAML用法, 相关主题XAML语言规范XAML语言规范中也定义或引用了此处定义的XAML语法术语。XAML是一种基于 XML并遵循或扩展 XML结构规则的语言。其中某些术语共享自或基于描述XML语言或XML文档对象模型时常用的术语。有关XAML语言规范的更多信息,请从Microsoft下载中心下载MS-XAML。XAML 和 CLRXAML是一种标记语言。顾名思义,公共语言运行时(CLR)实现了运行时执行。XAML本身并非CLR运行时直接使用的一种公共语言。而是可

53、以将 XAML视为支持其自身的类型系统。 WPF所使用的特定 XAML分析系统是根据 CLR和CLR类 型系统构建的。在分析 WPF的XAML时,XAML类型将映射到 CLR类型,以便将运行时表示形式实例化。出于此原因, 本文档中语法讨论的其余部分将包括对CLR类型系统的引用,而XAML语言规范中并未就这部分语法展开讨论。(在XAML语言规范的每个级别,XAML类型都可以映射到任何其他类型系统,而不一定要映射到CLR,但这需要创建和使用一种不同的XAML分析器。)类型成员和类继承属性和事件在作为 WPF类型的XAML成员时,通常从基类型继承而来。请考虑此代码示例:ButtonBackgroun

54、d="Blue" ./。如果要查看类定义、反射结果或文档,则Background属性并不是Button类上立即声明的属性。相反,Background是从基Control类继承而来。WPF XAML元素的类继承行为与架构对XML标记的强制解释大相径庭。类继承可能会变得很复杂,特别是在中间基类为抽象类或涉及到接口的情况下尤为如此。由于这样一个原因,因此很难通过XML编程常用的架构类型(例如DTD或XSD格式)准确并完整地表示 XAML元素及其所允许特性的集合。另一个原因是, XAML语言本身的扩展性和类型映射功能会对所 允许类型和成员的任何固定表示形式的完整性造成妨碍。对象元素

55、语法对象元素语法是一种 XAML标记语法,它通过声明 XML元素将CLR类或结构实例化。这种语法类似于如HTML等其他标记语言的元素语法。对象元素语法以左尖括号()开始,后面紧跟要实例化的类或结构的类型名称。类型名称后面可以有零个或多个空格,对于对象元素还可以声明零个或多个特性,并用一个或多个空格来分隔每个特性名="值"”对。最后,必须存在下列一种情况: 元素和标记必须用正斜杠 (/)和紧跟的右尖括号()结尾。 开始标记必须以右尖括号 ()结尾。其他对象元素、属性元素或内部文本可以跟在开始标记后面。此处可以包含的确切内容通常会受到元素对象模型的约束。对象元素还必须存在等效的

56、结束标记,并与其他开始标记/结束标记对形成正确的嵌套和平衡。由.NET实现的XAML具有一组规则,可将对象元素映射为类型、将特性映射为属性或事件以及将XAML命名空间映射到CLR命名空间和程序集。对于 WPF和.NET Framework , XAML对象元素映射到 Microsoft .NET类型(如引用的程序集中 所定义),而特性映射到这些类型的成员。在 XAML中引用CLR类型时,还可以访问该类型的继承成员。例如,下面的示例是一个对象元素语法,该语法实例化Button类的一个新实例,而且还指定了一个Name特性及其值:XAML<Button Name="CheckoutB

57、utton"/>下例是其中也包括 XAML内容属性语法的对象元素语法。其中包含的内部文本将用于设置TextBox的XAML内容属性Text。XAML<TextBox>Thisis a Text Box</TextBox>内容模型从语法上讲,类可能支持作为XAML对象元素的用途,但只有将该元素放置在整体内容模型或元素树中的应有位置时,该元素才能在应用程序或页面中发挥正常的作用。例如,Menuitem通常只应作为MenuBase派生类(如Menu)的子级放置。 在可 用作XAML元素的控件和其他 WPF类的类页面上,将特定元素的内容模型记录为备注的一部分。对

58、象元素的属性XAML中的属性是由多种可能的语法设置的。根据所设置属性的基础类型系统的特征,可用于特定属性的语法将有所不同。通过设置属性值,可以在对象存在于运行时对象图中时为对象添加功能或特征。从对象元素中创建的对象的初始状态基于默认 的构造函数行为。通常,您的应用程序将使用其他一些实例,而不是任何给定对象的完全默认的实例。特性语法(届性)特性语法是一种 XAML标记语法,该语法声明现有对象元素中的特性,从而设置属性的值。特性名称必须与支持相关对象元 素的类的属性的CLR成员名称相匹配。特性名称后面跟随一个赋值运算符 (=)。特性值必须是用引号引起来的字符串。可说明可以使用替代引号在特性中放置文本引号。例如,可以使用单引号作为声明其中包含双引号字符 的字符串的一种方法。无论使用单引号还是双引号,对于开始和结束特性值字符串都应该使用一 对匹配的字符。还有一些转义序列或其他技术可用于解决任何特定XAML语法规定的字符限制。请参见XML字符实体和 XAML。为了通过特性语法进行设置,属性必须为公共属性,并且必须可写。后备类型系统中属性的值必须为值类型,或者必须为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论