XAML 概述三

时间:2022-09-16 13:52:07

通过对前面2节对XAML的介绍,我们对XAML有了一定的认识。这一节我们来简单了解一下部分XAML命名空间(x:)语言功能。

x命名空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,它包含的类与解析XAML语言相关。与C#语言一样,XAML也有自己的编译器。XAML文档会被解析并编译,最终形成IL存储在程序集中。在解析和编译XAML的过程中,我们需要告诉编译器一些信息,比如XAML代码编译结果与那个C#代码的编译结果合并等。这些能让我们与XAML编译器沟通的工具就放在x名称空间中。

通过x命名空间在XAML中出现的形式,我们可以分为如下几类:

 · Attribute

 · 标记扩展

 · XAML指令元素

接下来我们就来介绍一下其中主要的功能。

一. x命名空间中的Attribute

1. x:Class

这个Attribute的作用是告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。语法为:

<object x:Class="namespace.classname"...>
...
</object>

这个Attribute只能用于根节点

namespace可填。指定一个包含由 classname 标识的分部类的 CLR 命名空间。 如果指定了 namespace,则用一个点 (.) 来分隔 namespace 和 classname。

classname必填。并且必须与该代码隐藏相连接的分部类的名称对应。并且代码隐藏相连接的类必须使用部分类,也就是partial关键字修饰。

2. x:ClassModifier

在同时提供了 x:Class 的情况下,修改 XAML 编译行为,告诉由标签生成的类具有怎样的访问控制级别。

使用时必须注意:

 · 必须同时具有x:Class

 · 必须与x:Class所指示类的访问控制级别一致。分为public(默认的)和internal2种。

3. x:Name

如果我们通过XAML声明了一个元素,XAML编译器会为我们生成一个与该元素对应的对象。但是如果我们想在代码中找到该元素并使用,就必须为该对象声明一个引用类型的变量。这个时候x:Name就派上用场了。

它具有2个作用:

 · 告诉XMAL编译器,当一个标签元素带有x:Name时,除了要生成对应的实例,还要生成一个引用类型的变量,这个变量名就是x:Name的值。

 · 讲生成对象的Name属性(如果有)也设置成x:Name的值,并把这个值注册到UI树上,方便查找。

在XAML中,必须为类声明了RuntimeNameProperty特性才能使用Name,它和x:Name是等效的。

我们查看StackPanel的源代码,发现在间接基类FrameworkElement中,使用了RuntimeNameProperty("Name")特性,所有在使用XAML的时候才有Name属性。

我们不能同时设置Name和x:Name。最好使用x:Name,因为有的元素没有Name这个Attribute,并且x:Name的功能覆盖了Name的功能。

4. x:FileModifier

在使用x:Name后,XAML元素对应的实例就有了自己的引用类型的变量,这些变量都是类的字段。这些字段的访问级别默认都是internal的,如果我们想改变他的访问级别,就可以使用x:FileModifier。

需要注意的一点就是x:FileModifier,必须要和x:Name(或Name)一起使用。

5. x:key

在XAML中,我们可以把需要多次使用的内容提取出来放在资源字典中,需要使用这个资源字典的时候就要使用它的key检索出来。语法为:

<object x:Key="stringKeyValue".../>
-or-
<object x:Key="{markupExtensionUsage}".../>

第一种是要用作键的文本字符串。 文本字符串必须符合XamlName语法。

第二种是使用标记扩展。

在XAML中定义的资源的x:key,同样可以使用this.FindResource("keyName")方法在代码隐藏文件中访问。

6. x:Shared

该Attribute必须和x:key同时使用。当我们把某些对象作为资源放进资源字典后,可以把它检索出来反复使用。那么当我们每次检索的时候,是同一个对象,还是多个对象的副本就需要设置x:Shared的值。默认值为true,当设置成false的时候,会修改 WPF 资源检索行为,以便特性化资源请求为每个请求创建一个新实例,而不是所有请求共享同一个实例。

二. 标记扩展

1. x:Type

一般情况下我们操作的是数据类型的实例或者引用,但是有时候需要使用x:Type来操作数据类型本身。

<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily" Value="Segoe Black" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="FontSize" Value="12pt" />
<Setter Property="Foreground" Value="#777777" />
</Style>

上面这个例子就是操作TextBlock控件,并设置他的样式。

2. x:Null

在C#代码中,我们使用null来表示空值,但是在XAML中使用x:Null.

比如上面一段示例代码定义了TextBlock的样子,我们还可以在代码里面设置它,让他为空来覆盖这个样式资源。

<TextBlock Style="{x:Null}">OK</TextBlock>

3. x:Array

它的作用就是通过它的Items(只读)属性,向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员类型由Type属性指明。

<ListBox Margin="5">
<ListBox.ItemsSource>
<x:Array Type="system:String">
<system:String>A</system:String>
<system:String>B</system:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>

我们不能设置ItemsSource="{x:Array Type=system:String,Items=xxxx},因为Items是一个只读属性。

上面的例子,我们就是使用属性元素的方式来声明的。在解析的时候,会调用ArrayExtension源代码中的AddChild方法,把A,B添加到Items里。

4. x:Static

它的作用是访问一个static类型的属性或者字段。

三. XAML指令元素

只有x:Codex:XData

前面已经讲过x:Code,我们来看看x:XData。WPF中巴包含数据源的对象称为数据源,用于把数据源中的数据提供给使用者的对象称为数据提供者。WPF类库中包含许多数据提供者,其中一个是XmlDataProvider,专门用于提供XML化的数据。我们通过一个例子就明白了:

<Window.Resources>
<XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
<x:XData>
<Inventory xmlns="">
<Books>
<Book ISBN="0-7356-0562-9" Stock="in" Number="9">
<Title>XML in Action</Title>
<Summary>XML Web Technology</Summary>
</Book>
<Book ISBN="0-7356-1370-2" Stock="in" Number="8">
<Title>Programming Microsoft Windows With C#</Title>
<Summary>C# Programming using the .NET Framework</Summary>
</Book>
<Book ISBN="0-7356-1288-9" Stock="out" Number="7">
<Title>Inside C#</Title>
<Summary>C# Language Programming</Summary>
</Book>
<Book ISBN="0-7356-1377-X" Stock="in" Number="5">
<Title>Introducing Microsoft .NET</Title>
<Summary>Overview of .NET Technology</Summary>
</Book>
<Book ISBN="0-7356-1448-2" Stock="out" Number="4">
<Title>Microsoft C# Language Specifications</Title>
<Summary>The C# language definition</Summary>
</Book>
</Books>
<CDs>
<CD Stock="in" Number="3">
<Title>Classical Collection</Title>
<Summary>Classical Music</Summary>
</CD>
<CD Stock="out" Number="9">
<Title>Jazz Collection</Title>
<Summary>Jazz Music</Summary>
</CD>
</CDs>
</Inventory>
</x:XData>
</XmlDataProvider>
</Window.Resources> <StackPanel>
<ListBox Width="500" Height="300" Background="Honeydew">
<ListBox.ItemsSource>
<Binding Source="{StaticResource InventoryData}"
XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/>
</ListBox.ItemsSource>
</ListBox>
</StackPanel>

我们在资源中通过x:XData定义了一个XML的数据源,并通过XmlDataProvider提供给使用者ListBox.

XAML 概述三的更多相关文章

  1. XAML 概述

    我们将向 Windows 运行时应用开发人员介绍 XAML 语言和 XAML 概念,并介绍在使用 XAML 创建 Windows 运行时应用时,在 XAML 中声明对象和设置属性的不同方式. 什么是 ...

  2. Windows10-UWP中设备序列显示不同XAML的三种方式&lbrack;3&rsqb;

    阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...

  3. XAML 概述四

    这一节我们来简单介绍一下XAML的加载和编译,它包括如下三种方式:  · 只使用代码  · 使用代码和未编译的XAML  · 使用代码和编译过的BAML 一. 只使用代码 我们首先创建一个简单的控制台 ...

  4. XAML 概述二

    通过上一节我们已经对XAML有了一定的了解,这一节我们来系统的学习一下XAML. 一. 简单属性与类型转换器,属性元素: 我们已经知道 XAML是一种声明性的语言,并且XAML解析器会为每个标签创建一 ...

  5. TCP概述&bsol;三次握手四次挥手&bsol;报文首部&comma;常用熟知端口号

    06.26自我总结 1.TCP概述 TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为 ...

  6. XAML 概述一

    XAML的全称是Extensible Application Markup Language,就是我们所说的可扩展应用程序标记语言.XAML可以应用到许多不同领域,但主要用于构建用户界面. XAML是 ...

  7. 【翻译】MVC Music Store 教程-概述&lpar;三&rpar;

    Controller 与传统的Web框架,将传入的URL通常映射到磁盘上的文件.例如:一个URL请求“/Products.aspx" 或"/Products.php”是处理一个Pr ...

  8. WPF:XAML概述

    简介 XAML是eXtensible Application Markup Language可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言.XAML提供了一种便于 ...

  9. &period;Net Core WPF之XAML概述

    原文链接,机器翻译,有误处参看原文. XAML overview in WPF 2019/08/08 What is XAML XAML syntax in brief Case and white ...

随机推荐

  1. linux命令:find

    1.命令介绍: find用来在整个系统指定的路径下搜索文件,功能强大,但是遍历整个系统时很耗时间. 2.命令格式: find 路径 [选项] [print -exec -ok...] 3.命令参数: ...

  2. Hermes:来自腾讯的实时检索分析平台

    实时检索分析平台(Hermes)是腾讯数据平台部为大数据分析业务提供一套实时的.多维的.交互式的查询.统计.分析系统,为各个产品在大数据的统计分析方面提供完整的解决方案,让万级维度.千亿级数据下的秒级 ...

  3. c&num;做动态(gif)中文验证码

    无意中在国外论坛发现一个gif动画类,我使用它来制作了一个动态验证码 : 一:首先新建一个类库 1:新建AnimatedGifEncoder类 using System; using System.C ...

  4. GBK转utf-8,宽字符转窄字符

    //GBK转UTF8 string CAppString::GBKToUTF8(const string & strGBK) { string strOutUTF8 = "&quot ...

  5. 扩展Python模块系列&lpar;五&rpar;----异常和错误处理

    在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...

  6. PCL中Sample&lowbar;consensus分割支持的几何模型

    随机采样一致分割法,从点云中分割出线.面等几何元素 #include <pcl/sample_consensus/method_types.h> #include <pcl/samp ...

  7. ASP&period;NET MVC 使用 Log4net 记录日志

    Log4net 介绍 Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版.我们可以控制日志信息的输出目的地.Log4net中定义了多种日志信息输出模式.它可以根据需要 ...

  8. asp&period;net url址址中中文汉字参数传递乱码解决方法

    中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirec ...

  9. freeSWITCH之多平台测试通信

    开始测试使用 强烈建议在统一的局域网下进行配置,通信 本机IP:192.168.1.155 架构 freeSWITCH搭建在以Windows平台作为通信服务器.fs_cli为服务器上测试客户端. X- ...

  10. thinkpadT480安装archlinux

    制作U盘启动盘 下载archlinux镜像 下载powerison 将镜像刻录到U盘中 设置bios 如果已经安装了win8+系统, 开机重启然后按f1,进入设置界面,加载启动项中将usb放到最前 保 ...