XAML的命名空间
命名空间格式:语法结构为“xmlns:”+“命名空间前缀名”,默认命名空间无需定义命名空间前缀名“xmlns”
命名空间的声明
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
命名空间的用途:约束文档规范,明确标签的类型。
xmlns(XML Namespace)默认命名空间
xmlns:x 可以理解为给命名空间起别名
xmlns不是XAML中特有或特别定义的,它是XML具备的,目的是为了约束XML的文档结构
xmlns:d 和 xmlsn:ms 是为 Visual Studio 设计视图服务的,不会对程序造成任何影响
URI 统一资源定位符:"http://schemas.microsoft.com/winfx/2006/xaml"
XAML名称范围(x:)语言特性
x:Class
配置XAML编译,在标记和代码隐藏之间连接分部类。代码分部类在一个独立的代码文件中定义,标记分部类由代码是由XAML在编译过程间创建。
<object
x:Class="namespace.classname"...>
...
</object>
x:FieldModifier
修改XAML编译行为,使指定对象引用的字段被定义有public访问权限而不是默认的private行为。
<object
x:FieldModifier="public"
... />
x:Key
唯一标识作为资源被创建和引用的元素,这些资源存在于一个ResourceDictionary中。
<ResourceDictionary>
<object x:Key="stringKeyValue".../>
</ResourceDictionary>
隐式 ResourceDictionary 中使用:
<object.Resources>
<object x:Key="stringKeyValue".../>
</object.Resources>
x:Name
唯一标识对象元素,可方便从代码隐藏或一般代码中访问已实例化的对象。应用于支持的编程模型之后,x:Name可视为等效于持有一个对象引用(由一个构造函数返回)的变量。
x:Key和x:Name不是相同的概念。
x:Key仅用于资源词典中。
x:Name用于XAML的所有区域。
一个使用键值的FindName调用不会检索键资源。
x:Uid
为标记元素提供一个唯一标识符。对于Windows运行时XAML,这个唯一标识符供XAML本地化过程和工具使用。
<Button
x:Uid="ResourceKey"
Content="被资源中键为“ResourceKey.Content的值替换”"/>
开发多语言化系统时会经常用到。
其他XAML固有数据类型,就是常见的简单数据类型的声明:
x:Boolean
对于CLR支持来说,原语对应于Boolean。XAML分析x:Boolean的值时区分大小写。请注意,"x:Bool"不是可接受的替代原语。
x:String
对于CLR支持来说,原语对应于String。对字符串的编码默认采用包围XML编码。
x:Double
对于CLR支持来说,原语对应于Double。除了数字值,x:Double的文本语法支持令牌 "NaN",这是将布局行为的"Auto"存储为资源值的方式。对这些令牌的处理区分大小写。你可以使用科学计数法,例如将1,000,000 记为"1+E06"。
x:Int32
对于CLR支持来说,原语对应于Int32。x:Int32被视为带有符号,你可以为负整数包含减号(“-”)。在XAML中,文本语法中缺少符号表示有符号正值。
对象声明方式
使用开始标记和结束标记将对象实例化为XAML格式的元素
<Canvas>
</Canvas>
对象中可以包含其他对象
<Canvas>
<Rectangle></Rectangle>
</Canvas>
若一个对象中不包含其他对象,可以使用一个自结束标记来声明对象
<Rectangle/>
XAML创建对象元素
- 标签名即控件名称
- 一个XAML文件只允许有一个根对象元素Page
- 标签属性或子标签为控件对象属性操作
- 每个XAML标签都会有一个相对应的类型
- 每声明一个XAML节点就相当于创建相应类型的对象
- 在哪个元素结点下添加标签就相当于在哪个对象下添加对象
属性设置四种方式
? 属性键值语法
? 属性元素语法
? 内容元素语法
? 隐式集合语法
不同的属性类型我们可以选择不同的设置方式
简单类型数据,比如字符串、数字之类的使用键值形式,即PropName=“PropValue”
复杂类型数据,比如文本块值、按钮内容、背景图片,使用属性元素形式
内容元素语法(默认语法)为了方便
集合性质使用集合语法
属性键值语法:
只有实例化对象才可以设置实例属性,格式如下:
<objectName propertyName=“propertyValue”/>
或者
<objectName propertyName=“propertyValue”>
<objectName>
每个属性对应一个属性值,属性值类型必须与属性匹配
一个标记中可以设置对象的多个属性
objectName是要实例化的对象,propertyName是需要设置的属性名称,propertyValue是属性的值
<Canvas Width=”150” Height=”150” Background=”Red”/>
或者
<Canvas Width=”150” Height=”150” Background=”Red”>
</Canvas>
绝大多数属性都是使用属性键值的形式来操作
要求属性类型必须为一些“简单的/可以自动转换的”类型
内置属性类型转换器
仅针对一些复杂类型的控件属性
用于将XAML属性中设置的字符串转换成为相应的强类型数据
例如:
<Button
x:Name="btn"
HorizontalAlignment="Left"/>
对比
btn.HorizontalAlignment = HorizontalAlignment.Left;
XAML中只需要将HorizontalAlignment属性设置为Left字符串即可将控件的水平对其属性改为左对齐
属性元素语法
某些属性可以使用属性元素语法来设置,格式为:
<object>
<object.property>
<!—元素属性值-->
</object.property>
</object>
如果一个对象的属性是一个复杂类型,不能够由简单的字符串直接表示的时候,这时需要用到属性元素的语法:
<标签名>
<标签名.属性名>
<属性值/>
</标签名.属性名>
</标签名>
文本块值,按钮内容,背景图片
<Ellipse Width=”150” Height=”150”>
<Ellipse.Fill>
<SolidColorBrush Color=”Green”/>
</Ellipse.Fill>
</Ellipse>
内容元素语法
某些元素的属性支持内容元素语法,允许忽略元素的名称
实例对象会根据XAML元素中的第一个标记值来设置属性
对于大量的格式化文本,使用内容元素语法更加灵活
属性标记之间可以插入大量的文本内容
<TextBlock>Windows 10</TextBlock>
对于大多数对象元素都有一个默认属性;
直接将元素的 “InnerText” 设置为属性值:
例如:
<Button x:Name="btn1" Content="Hello"/>
<Button x:Name="btn2">
World
</Button>
通过特性标签知道默认属性
[ContentProperty(Name = "Content")]
隐式集合语法
元素支持一个属性元素的集合,才使用集合语法进行设置属性
使用托管代码的Add方法来增加更多的集合元素
本质是向对象的集合中添加属性项
在此之前我们考虑的都是非集合性质的属性;
对于一个集合类的属性可以用重复子元素的方式实现设置值:
<Grid>
<Grid.Children>
<TextBlock>Hello1</TextBlock>
<TextBlock>Hello2</TextBlock>
<TextBlock>Hello3</TextBlock>
<TextBlock>Hello4</TextBlock>
<TextBlock>Hello5</TextBlock>
</Grid.Children>
</Grid>
<Rectangle Width=”200” Height=”150”>
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStopCollection>
<GradientStop Offset=”0.0” Color=”Gold”/>
<GradientStop Offset=”1.0” Color=”Green”/>
</GradientStopCollection>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width=”200” Height=”150”>
<Rectangle.Fill>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset=”0.0” Color=”Gold”/>
<GradientStop Offset=”1.0” Color=”Green”/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
省略GradientStopCollection隐式的属性设置方法
附加属性
附加属性作用于支持附加属性的元素
附加属性是由支持附加属性的父元素产生作用,支持附加属性的元素会继承所在的父元素的属性
附加属性的格式:AttachedPropertyProvider.PropertyName
AttachedPropertyProvider为附加属性的提供者,PropertyName为附加属性的名称
<Canvas>
<Rectangle Canvas.Left=”50” Canvas.Top=”50” Width=”200” Height=”150” RadiusX=”10” RadiusY=”10” Fill=”Gold”/>
</Canvas>
Rectangle元素设置了Canvas.Left和Canvas.Top属性,使用Canvas进行布局时,包含在<Canvas>…</Canvas>之间的元素就会产生相对于Canvas对象的附加属性Canvas.Left和Canvas.Top属性
依赖属性
英文名称:Dependency Properties
依赖属性和CLR属性类似,提供一个实例级私有字段的访问封装,通过GetValue和SetValue访问器实现属性的读写操作
最重要一个特点是属性值依赖于一个或者多个数据源,提供这些数据源的方式也可以不同
由于依赖多数据源的缘故,故称之为依赖属性
XAML的路由事件(Routed Events)处理方式可分为三种:
冒泡事件(Bubbling Event),该事件是最常见的事件处理方式。该事件表示对象激活事件后,将沿着对象树由下至上,由子到父的方式传播扩散,直到被处理或者到达对应的根对象元素,或者该事件对应得RoutedEventArgs.Handled=true时,完成处理。在传播扩散中,所有涉及的元素对象都可以被该事件进行控制。该事件可被Windows 8,Silverlight支持。
隧道事件(Tunneling Event),该事件处理方式和冒泡事件相反,对象激活事件后,将从根对象元素传播扩散到激活事件的子对象,
或者该事件对应得RoutedEventArgs.Handled=true时,完成处理。该事件仅Windows 8支持。
直接路由事件(Direct Routing Event),该事件没有向上或者向下传播扩散,仅作用于当前激活事件的对象上。该事件可被Windows 8,Silverlight支持。
常见的标记扩展
{Binding}提供一个data-bound属性值,使该值可延迟到运行时。绑定标记扩展会在XAML 加载时转换为一种中间表达式对象。数据绑定引擎在运行时使用表达式和数据上下文来确定属性值。
通过计算对一个来源于自定义资源查找实现的资源的引用,为任何XAML属性提供一个值。资源查找是通过CustomXamlResourceLoader类实现执行的。
提供一种方式,在运行时对象图中以相对关系形式指定绑定来源。
通过计算对一个已定义资源的引用,为任何XAML属性提供一个值。资源在一个ResourceDictionary中定义,一种StaticResource用法在ResourceDictionary中引用该资源的键。
将一个控件模板中的属性值链接到模板控件上其他某个公开的属性的值。TemplateBinding只能在XAML中的一个ControlTemplate定义中使用。
使用根据当前处于活动状态的主题检索不同资源的附加系统逻辑,通过计算对某个资源的引用来为任何XAML属性提供值。与StaticResource类似,资源是在ResourceDictionary中定义的,并且ThemeResource用法引用ResourceDictionary中的该资源的键。