您的位置:首页 > 编程语言

WPF基础之XAML----(XAML 根元素和 xmlns,事件和 XAML 代码隐藏)

2012-05-16 17:59 239 查看
XAML 根元素和 xmlns

一个 XAML 文件只能有一个根元素,这样才能成为格式正确的 XML 文件和有效的 XAML 文件。通常,应选择属于应用程序模型一部分的元素(例如,为页面选择 Window 或 Page,为外部字典选择 ResourceDictionary,或为应用程序定义根选择 Application)。下面的示例演示 WPF 页面的典型 XAML 文件的根元素,其中的根元素为 Page。



根元素还包含属性 xmlns 和 xmlns:x。这些属性向 XAML 处理器指明哪些命名空间包含标记将要引用的元素的元素定义。xmlns 属性专门指示默认的 xmlns 命名空间。在默认的 xmlns 命名空间中,可以不使用前缀指定标记中的对象元素。对于大多数 WPF 应用程序方案以及 SDK 的 WPF 部分中给出的几乎所有示例,默认的 xmlns 命名空间均映射为 WPF 命名空间
http://schemas.microsoft.com/winfx/2006/xaml/presentation。xmlns:x 属性指示另外一个 xmlns 命名空间,该命名空间映射 XAML 语言命名空间
http://schemas.microsoft.com/winfx/2006/xaml。在具有此映射的文件的标记中引用时,XAML 规范定义的必需语言组件带有 x: 前缀。使用 xmlns 定义用法范围和映射的这种做法符合 XML 1.0 规范。请注意,xmlns 属性仅在每页的根元素上和应用程序定义上(如果在标记中提供了应用程序定义)才是严格必需的。xmlns 定义将应用于根的所有子元素。(此行为仍然符合
xmlns 的 XML 1.0 规范。)xmlns 属性还允许出现在根下面的其他元素上,并且将应用于定义元素的任何子元素。但是,此用法并不典型,因为频繁定义或重新定义 xmlns 命名空间可能会导致 XAML 标记样式难以阅读。

由于存在属于项目生成文件一部分的配置,因此可以知道 WPF 程序集包含的某些类型支持 WPF 到默认 xmlns 的映射。程序集还映射到目标文件中。因此,为了引用来自 WPF 程序集的 XAML 元素,只需映射 xmlns 即可。对于您自己的自定义程序集,或者除 WPF 之外的程序集,可以将该程序集指定为 xmlns 映射的一部分。通常,可选择其他前缀,但是也可以选择其他 xmlns 作为默认值,然后将 WPF 映射到前缀。

x: 前缀

在前面的根元素示例中,前缀 x: 用于映射 XAML xmlns http://schemas.microsoft.com/winfx/2006/xaml。在此 SDK 的项目模板、示例以及文档中,此 x: 前缀将用于映射 XAML xmlns。x: 前缀/XAML xmlns 包含多个将在 XAML 中频繁用到的编程构造。下面列出了将用到的最常见 x: 前缀/XAML xmlns 编程构造:

x:Key:为 ResourceDictionary 中的每个资源设置一个唯一的键。在应用程序标记中看到的所有 x: 用法中,x:Key 可能占到 90%。

x:Class:向为 XAML 页提供代码隐藏的类指定 CLR 命名空间和类名。必须具有这样一个类才能支持代码隐藏,也正是由于这个原因,即使没有资源,您也几乎总是会看到映射的 x:。

x:Name:处理对象元素后,为运行时代码中存在的实例指定运行时对象名称。在不支持等效的 WPF 框架级Name 属性的情况下命名元素时,可以使用 x:Name。某些动画方案中会发生这种情况。

x:Static:启用一个获取静态值的值引用,该静态值只能是一个 XAML 可设置属性。

x:Type:根据类型名称构造一个 Type 引用。它用于指定采用 Type 的属性 (Attribute),如 Style..::.TargetType,不过在许多情况下属性 (Property) 本身具有字符串到 Type 的转换功能,因此使用 x:Type 是可选的。

x: 前缀/XAML xmlns 中还有其他一些不太常见的编程构造。

事件和 XAML 代码隐藏

大多数 WPF 应用程序都是既包括标记,又包括代码隐藏。在一个项目中,XAML 被编写为 .xaml 文件,而使用 CLR 语言(如 Microsoft Visual Basic .NET 或 C#)编写代码隐藏文件。编译 XAML 文件时,每个 XAML 页的 XAML 代码隐藏文件的位置是通过指定一个命名空间和类作为 XAML 页的根元素的 x:Class 属性来确定的。

在目前已介绍的示例中,您已看到几个按钮,但还没有一个按钮具有任何关联的逻辑行为。为对象元素添加行为的主要应用程序级机制是使用元素类的现有事件,并为在运行时引发该事件时调用的该事件编写特定的处理程序。事件名称以及要使用的处理程序的名称在标记中指定,而实现处理程序的代码在代码隐藏中定义。





请注意,代码隐藏文件使用命名空间 MyNamespace 并将 MyPageCode 声明为该命名空间内的一个分部类。这相当于在标记根中提供的 MyNamespace.MyPageCode 的 x:Class 属性值。编译器将通过从根元素类型派生一个类,自动为编译的任何 XAML 页创建一个分部类。当您提供也会定义同一分部类的代码隐藏时,将在与编译的应用程序相同的命名空间和类中组合生成的代码。

如果您不想创建单独的代码隐藏文件,还可以将代码内联到 XAML 文件中。但是,内联代码是一种缺少多样性的方法,有很多的限制。

XAML 页面根元素剖析

下表显示了一个典型的 XAML 页面根元素分解结构,并显示了本主题中介绍的根元素的具体属性:



基类和 XAML

基础 XAML 及其架构是一个类集合,这些类对应于 CLR 对象以及要在 XAML 中使用的标记元素。但是,并不是所有的类都能映射到元素。抽象类(如 ButtonBase)和某些非抽象基类在 CLR 对象模型中用于继承,并且不支持对应的 XAML 标记。基类(包括抽象类)对于 XAML 开发仍然很重要,因为每个具体的 XAML 元素都从其层次结构中的某个基类继承成员。通常,这些成员包括可以设置为元素属性 (Attribute) 的属性 (Property),或者可以处理的事件。FrameworkElement
是 WPF 在 WPF 框架级的具体 UI 基类。设计 UI 时,您将使用各种形状、面板、修饰器或控件类,它们全部从 FrameworkElement 派生而来。有一个相关的基类 FrameworkContentElement,它使用可在 FrameworkElement 中特意镜像 API 的 API,支持适合流布局表示形式的面向文档的元素。元素级的属性 (Attribute) 和 CLR 对象模型的组合提供了一组通用的属性 (Property),可以在大多数具体的 XAML 元素上设置这些属性 (Property),而不管确切的元素类型及其基础类是什么。

XAML 安全性

XAML 是一种直接表示对象实例化和执行的标记语言。因此,使用 XAML 创建的元素能够像等效的生成代码那样与系统资源进行交互(如网络访问、文件系统 IO)。

WPF 支持 .NET 安全框架代码访问安全性 (CAS)。这意味着在 Internet 区域中运行的 WPF 内容具有更少的执行权限。“松散 XAML”(由 XAML 查看器在加载时解释的未编译 XAML 的页面)和 XAML 浏览器应用程序 (XBAP) 通常在此 Internet 区域中运行,并且使用相同的权限集。但是,加载到完全受信任的应用程序中的 XAML 与宿主应用程序具有相同的系统资源访问权限。有关更多信息,请参见 Windows Presentation Foundation 部分信任安全性。

从代码中加载 XAML

XAML 可用于定义整个 UI,但有时也适合只使用 XAML 定义 UI 的一部分。利用此功能可以实现部分自定义、在本地存储信息、使用 XAML 提供业务对象或者各种可能的方案。这些方案的关键是 XamlReader 类及其 Load 方法。输入是一个 XAML 文件,而输出是一个对象,它表示从该标记中创建的对象的整个运行时树。然后您可以插入该对象,作为应用程序中已存在的另一个对象的属性。只要该属性在具有最终显示功能并且将通知执行引擎已在应用程序中添加新内容的内容模型中是一个合适的属性,您就可以通过以 XAML
形式加载来轻松地修改正在运行的应用程序的内容。请注意,通常只在完全受信任的应用程序中使用此功能,因为将文件加载到正在运行的应用程序中会带来明显的安全隐患。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: