一、xaml简介
1.定义
xaml extensible application markup language
2.由来,为什么会有这个
winform 时代,每个空间都是使用后台代码生成,wpf页面显示使用xml实现(但是也可以后台代码),这样解决了开发人员和设计人员协作开发的问题。
3.xaml变体应用
wpf xaml
xps xaml
silverlight xaml
wf xaml
4.xaml编译
被编译为baml(binary application markup language),二进制应用程序标记语言,是xaml的二进制表示。
目的是能够让程序快速运行,并很容易的迁移到其他工具和平台。
二、xaml基础
1.xaml文档中的每个元素都会被映射为.net类的实例,元素的名称也和类名一致.
2.元素之间可以相互嵌套
3.元素的属性(attribute)设置每个类的属性(property)
4.尽管可以使用任何的顶级元素,但是wpf应用程序只使用以下几个元素作为顶级元素:
window元素
page元素
application元素
5.xaml名称空间
a. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation "
b. xmlns:"x=http://schemas.microsoft.com/winfx/2006/xaml"
因为xaml中的元素对应.net类的一个实例,名称空间指代的是这些类的名称空间(位置),上面的a命名空间是wpf的核心名称空间。它包含了所有的wpf类,包括用来构建用户界面的控件,b命名空间它包含xaml实用特性,这些特性可影响文档的解释方式。该名称空间被映射为前缀x,可以这样使用改名称空间(<x:elementName>)
备注:xaml的名称空间和.net的不是一一对应的。
6.代码隐藏类
<Window x:class="WindowsApplication.Window1">
7.给控件命名 Name /x:Name
包含name属性必须使用RuntimeNameProperty特性修饰。
[RuntimeNameProperty("Name")]
[StyleTypedProperty(Property = "FocusVisualStyle", StyleTargetType = typeof(Control))] [UsableDuringInitialization(true)] [XmlLangProperty("Language")] public class FrameworkElement :......三、xaml中的属性和事件
1.简单属性与类型转换器
[Localizability(LocalizationCategory.None, Readability = Readability.Unreadable)]
[TypeConverter(typeof(TransformConverter))] [ValueSerializer(typeof(TransformValueSerializer))] public abstract class Transform :如Transform属性,首先会检查Transform类的TypeConverter的声明,假若一个类没有这样的声明,会查找给属性使用值所对应的类的TypeConverter声明。如Foreground属性使用一个Brush对象作为属性的值,就会去检查Brush类的TypeConverter
2.复杂属性
元素的属性比较复杂,一个背景色要实现渐变,用简单的值表示的话会会比较难读懂,编程人员也容易出错,.xaml提供了属性元素语法,
<Grid Name="grid1">
<Grid.Background>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.00" Color="Red"/>
....
...
</Grid>
3.标记扩展 (todo 没完全明白28页)
将属性设置为一个已经存在的对象,或者可能希望通过将一个属性绑定到另一个空间来动态地设置属性值。
使用:{标记扩展 参数}
一般语法
<Button Foreground="{x:Static SystemColors.ActiveCaptionBrush}" >
属性元素语法
<Button>
<Button.Foreground>
<x:Static Member="SystemColors.ActiveCaptionBrush"></x:Static>
</Button.Foreground>
</Button>
标记扩展是StaticExtension类(根据约定,在引用扩展类时,可以省略最后一个单词Extension)
所有的标记扩展都由继承自System.Windows.Markup.MarkupExtension类的类来实现。
4.附加属性
附加属性常常用于控件布局。
<TextBox Grid.Row="0">
...
附加属性根本不是真正的属性,他们实际上被转换为方法调用,DefiningType.SetPropertyName(),上面的附加属性会调用Grid.SetRow()方法