第2章-XAML
XAML 名称空间
xmlns="http://schemax.microsft.com/winfx/2006/xaml/presentation"
是 WPF 核心名称空间。它包含了所有 WPF 类,包括用来构建用户界面的控件。
在该例中,该名称空间的声明没有使用一名称空间前缀,所以它成为整个的默认名称空间。换句话说,除非另行指明,每个元素自动位于这个名称空间。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
是 XAML 名称空间。它包含各种 XAML 实用特性,这些特性可影响文档的解释方式。
该名称空间被映射为 x. 这意味着可通过在元素名称之前放置名称空间前缀 x 来使用该名称空间。
<Window x:Class="WindowApplication1.Window1"
表示创建一个新类,这里指的是一个窗体类。而这个窗体类正好是一个 partail class,因此会与隐藏的 Window1.xaml.cs (这个叫:代码隐藏类)中的逻辑代码融合到一起,形成单一的单元。
命名元素
x:Name = "grid1"
等价于 `Name = "grid1"
简单属性
key = value 这样的就是简单属性。属性 = 特性。
属性对应的值,即关联字符串值将由类型转换器执行转换。
因此,如果希望将属性值转换成自定义的类型,可以在属性声明中改用 TypeConverter 特性。 👈❌不推荐使用。
关联:WPF系统级Converter - Dwaynerbing - 博客园 (cnblogs.com)
复杂属性 👉 也叫嵌套属性。
👉 属性元素语法。
采用嵌套式的元素表达属性的写法 👉 Grid.Background 。比如设置背景色为线性渐变时。
标记扩展
{}
用花括号设置值,如绑定,叫做标记扩展。
普通写法:
<Button ... Foreground="{x:Static SystemColors.ActiveCaptionBrush}"/>
🔥 嵌套属性写法:
<Button ...>
<Button.Foreground>
<x:Static Member="SystemColors.ActiveCaptionBrush"></x:Static>
</Button.Foreground>
</Button>
附加属性
附加属性是可用于多个控件但在另一个类中定义的属性。在 WPF 中,附加属性常用于控件布局。
比如设置 TextBox 在 Grid 中的位置时,Grid.Row 就是 TextBox 的附加属性。
附加属性虽然格式是属性的写法,但在实际运行是,它会被转换成方法。
这里的 Grid.Row 将会转换成 Grid.SetRow()。
💡 附加属性其实是特殊类型的依赖属性。
嵌套元素
嵌套的元素,使用以下三种机制进行中转
- 如果父元素实现了
IList
接口,解析器将调用IList.Add()
方法,并且为该方法传入子元素作参数。 - 如果父元素实现了
IDictionary
接口,解析器将调用IDictionary.Add()
方法,并且为该方法传递子元素作为参数。当使用字典集合时,还必须设置x:Key
特性以便为每个条目指定键名。 - 如果父元素使用
ContentProperty
特性进行修饰,解析器将使用子元素设置对应的属性。
特殊字符与空白
小于号:<
大于号:>
&符号:&
引号":"
...
💡 保留文本中的空格
默认情况下,XAML 折叠所有空白,这意味着包含空格、TAB 键以及硬的长字符串将被转换为单个空格。
👉 使用该特性会保留所有的空格。❗❗❗除了文本中的空格,回车换行及TAB键也会被保留下来。
也就是说:如果下面的文本是分两行的,字显示的时候也是显示两行的。
👉 需要特别注意的是,文本之前的缩进也会被当成空格添加到文本之前。
<TextBox xml:space="preserve" ...>
[There is a lot of space inside these quotation marks " ".]
</TextBox>
使用其他名称空间中的类型
引用类时名称空间映射到XML名称空间语法:
xmlns:Prefix="clr-namespace:Namespace;assembly=AssemblyName"
xmlns:映射名="clr-namespace:类库中命名空间的名字;assembly=类库文件名"
- Prefix:名称空间前缀(相当于映射的别名)
- Namespace:是完全限定的 .NET 名称空间
- AssemblyName:是声明类型的程序集,没有 .dll 扩展名。
👉 引用 System 名称空间中的基本类型
xmlns:sys="clr-namespace:System;assembly=mscorlib"
👉 只引用项目集(以下引用当前项目)
xmlns:local="clr-namespace:MyNameSpace"
💡 只引用了当前项目所在的名称空间,即使使用本地项目的所有类
<sys:DataTime>10\12\2 10:20 PM</sys:DataTime>
💡 中间的文本会被自动转换成日期格式
加载和编译 XAML
以下三种方式都可以
- 只使用代码
- 使用代码和未经的标记(XAML)
- 使用代码和编译过的标记(BAML)
💡 XAML 被编译后的文件为 BAML 文件,位于 obj/Debug 目录下。而对应的 CS 文件,则会在 obj/Debug 目录下生成为 .g.cs 文件 (g 表示生成的)
本文作者:石起起
本文链接:https://www.cnblogs.com/myshiqiqi/p/18700084
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步