XAML语言
是Extensible Application Markup Language的简称,中文称为“可扩展应用程序标记语言”,英文发音是“zammel”.该语言是基于Extensive Markup Language(XML)可扩展标记语言,英文发音/ˌeksemˈel/
XAML是一种敏感型,声明性语言,对于字符大小写有严格的约束,在项目中,以".xaml"作为文件扩展名,具有一个后台代码文件控制页面逻辑处理,这一机制将用户界面设计和后台代码设计分割,这意味着项目美工人员可以使用Expression Blend进行XAML用户界面设计,同时后台代码开发人员可在Visual Studio中共享该XAML文件,并同时设计其后台代码。
XAML文档是一个XML文档,在一定程度上XAML继承了大量的XML概念,而最重要的两个概念分别是Element(元素)的定义和Property(属性)的使用
1.XAML基础 - Object (对象)
在XAML代码中,一个Element(元素)通常是一个Object(对象),在代码中映射对应.Net类。简单理解,
在XAML中声明一个Element元素,也就是对相应公共语言运行类库进行一次实例化操作
XAML代码声明一个元素对象,必须由一个开始标签“<元素对象>”和一个结束标签“</元素对象>”构成,基本语法如下:
<元素对象></元素对象>
例如,在XAML中声明一个文本框,代码如下:
<TextBox></TextBox>
上述代码中开始标签“<TextBox >”是实例化对象名称。结束标签“</TextBox >”,是对应开始标签中的元素对象名称。
在windows 8和silverlight的XAML语法中,支持略缩式元素结束标签,其语法格式如下:<TextBox />该语法格式省略</TextBox>结束标签,使用“/”符号作为元素结束符。
值得注意的是,XAML中Elements(元素)和Attributes(特性)名称是字符大小写敏感型,也就是大写和小写字符命名具有不同的含义。
2XAML基础 - Property (属性)
在面向对象程序开发中,我们所提及的属性,即是指对象的属性。而开发过程中,对象属性也是最重要,最常用的概念。 在XAML代码中,允许开发人员声明“元素对象”,不同的“元素对象”对应着多个对象属性。例如,一个TextBox文本框,有背景属性,宽度属性,高度属性等。
为了适应实际项目的需求,XAML提供三种方法设置属性,分别是:
- 通过Attribute特性设置对象属性;
- 通过Property属性元素设置对象属性;
- 通过隐式数据集设置对象属性;
Attribute是语言层面的东西,是给XAML编译器看的,Property是面向对象层面的东西,是给编程逻辑用的。在使用XAML编程的时候,如果你想给他加上一些特殊的标记从而影响XAML编译器对他的解析,那么就要对他添加一些Attribute。
2.1Attributes特性的概念
1、使用Attribute特性语法
- <元素对象 属性名=“属性值” 属性名=“属性值” …></元素对象>
- <元素对象 属性名=“属性值” 属性名=“属性值” …/>
例如:
<Rectange x:Name="rectange" Width="100" Height="100" Fill="Red" />
由于元素对象属性名在开始标签内部,所以这种表达方式也被称为“内联属性”。
XAML分析器会把上面的代码解析成为C#的类,当然也可以直接使用C#的代码来实现元素和属性设置,下面来看看上面这个例子的C#代码实现
Rectange r = new Rectange();
r.Name = "rectange";
r.Width = 100.0;
r.Height = 100.0;
r.Fill = new SoildColorBrush(Colors.Red);
2、Property属性元素的概念
使用XAML的Attribute特性可以简单快捷的设置对象的属性,其属性值局限于简单的字符形式。在实际项目中,经常会遇到复合型控件或者自定义控件引用较为复杂的对象属性,以达到个性化的效果。对此Attribute特性无法支持,从而引入Property属性元素的概念。
下面用伪代码来表示使用Property元素语法来实现属性的设置
<元素对象>
<元素对象.属性>
<属性设置器 属性值=“”>
</元素对象.属性>
</元素对象>
其中,属性设置器可以设置为较为复杂的对象元素,例如布局控件元素,自定义控件元素等。
下面是用一个矩形控件演示Property属性的作用,设置矩形的填充使用Fill属性,使用Attribute特性设置上面的Rectange的内容,如下代码:
<Rectange x:Name="rectange" Width="100" Height="100">
<Rectange.Fill>
<SoildColorBrush Color = "Red"/>
</Rectange.Fill>
</Rectange>
其运行效果和Attribute特性设置按钮内容相同。从示例中可以看出,使用元素对象的Property属性设置方法,比Attribute特性要灵活和强大。
3、使用隐式对象语法
通过学习Property属性元素,可以了解到XAML的元素对象属性,不仅包含单一对象属性,同时还支持复杂属性,属性值可以为简单的字符数据类型,同时也可以是一个数据集。
再来看一个Button中添加一个文字
<Button>
<Button.Content>
<TextBlock Text="陈仁松XAML教程"/>
</Button.Content>
</Button>
还可以这么写
<Button>
<Button.Content>
陈仁松XAML教程
</Button.Content>
</Button>
为了简化XAML代码复杂性,提高代码易读性,XAML提供隐式数据集设置对象属性方法。上面设置Button的Content属性还可以这样写:
<Button>
<TextBlock Text="陈仁松XAML教程"/>
</Button>
<Button>
陈仁松XAML教程
</Button>
从对比以上代码可以看出<Button.Content>被删除后,仍旧可以对Content进行赋值操作。其运行结果和使用Property属性元素属性赋值相同,使用隐式对象语法属性赋值在Windows 10 UWP自定义控件模板和样式中经常用到,是常用属性赋值方法之一。
命名空间
maui wpf 支持
https://learn.microsoft.com/zh-cn/dotnet/desktop/xaml-services/xaml-2009-language-features
- NameSpace命名空间格式
- 核心NameSpace命名空间
- 设计类NameSpace命名空间
- 自定义NameSpace命名空间
- XAML命名空间的x:Class属性
- XAML命名空间的x:Name属性和x:Key属性
- XAML的x:ClassModifier属性和x:FieldModifier属性
- Silverlight命名空间和Windows 8命名空间的不同
XAML命名空间的概念和C#代码中的Using,VB.Net代码中的Import相似,其作用是为对象元素的实例化提供引用类库声明。
简单的理解,当在XAML页面中需要调用某控件对象时,需要提前对该控件对象的类库进行引用声明,而定义XAML命名空间是类库引用声明的一种方法。
NameSpace命名空间格式
<UserControl>或<Page>作为页面Root对象元素被声明,其开始标签<UserControl>或<Page>中,包含了多个“xmlns”特性,在XAML语法规则中,“xmlns”是属于强制关键字,被用来声明一个命名空间。其语法结构为“xmlns:”+“命名空间前缀名”,而对于默认命名空间,无需定义命名空间前缀名。
1核心命名空间
xmlns[:可选映射前缀]="命名空间描述"
命名空间1:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
默认命名空间,该命名空间默认作用于整个页面 。
是WPF控件的命名空间代表了很多命名空间, 例如,System.Windows, System.Windows.UIElements, System.Windows.Controls 等类库
但是由于不同控件在不同的命名空间,引入起来特别麻烦,
因此XMAL就将这些命名空间封装到了一个URL标识中。
命名空间2:xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
引用的是默认的XAML类库,
其中包含大量的XAML专用的元素和属性,通过在标签中标记x:使用。
这两段命名空间是核心命名空间,也是写XAML必需引用的。
X名称空间里的成员(如X:Class、X:Name)是专门写给XAML编译器看de ,
用来引导XAML编译器把XAML代码编译成CLR代码的
下面我们开始根据分类来看一看它们各自的作用和主要使用方法
常用的一些Attribute
x:Class
这个Attribute主要告诉XAML编译器,编译的XAML将和哪一个类合并。
使用x:Class要注意:这个Attribute只能用于根节点,指向的类必须使用关键字partial
<Window x:Class="将窗体设为透明1.MainWindow"
public partial class MainWindow : Window
x:ClassModifier
这个Attribute主要告诉XAML编译器,有标签编译生成的类具有怎样的访问控制级别。
x:Name这个就如winform中的ID一样
XAML的标签声明的是对象,一个XAML标签对应一个对象,这个对象一般是一个空间类的实例。
x:Name的作用有两个:(1)告诉XAML编译器,当一个标签带有x:Name时除了为这个标签生成对应的实例外还要为这个实例声明一个引用变量,
这个变量名就是x:Name的值(2)将XAML标签所对应的对象的Name属性也设置为x:Name的值,并把这个值注册到UI树上,以方便查找。
使用x:Name后,XAML标签对应的实例就具有了自己的引用变量,而且这些引用变量都是类的字段。
<Grid>
<TextBox Width="100"
Margin="5"
HorizontalAlignment="Left"
VerticalAlignment="Top" />
<Button Margin="5"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Click="Button_Click"
Content="OK" />
</Grid>
private void Button_Click(object sender, RoutedEventArgs e)
{
Grid grid1 = this.Content as Grid;//MainWindow.Content属性引用着Grid的实例,而Grid的实例的Children[0]又引用着TextBox的实例
TextBox textBox = grid1.Children[0] as TextBox;
if (string.IsNullOrEmpty(textBox.Text))
{
textBox.Text = "hello";
}
else
{
textBox.Text = textBox.Name;
}
}
代码简写过程
<StackPanel Background="Gray">
<StackPanel.Children><!--可以简写掉,后台可通过Children属性遍历控件-->
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<Button Margin="5"/>
</StackPanel.Children>
</StackPanel>
x:FieldModifier
这个就是用来在XAML里改变引用变量访问级别的
<TextBox Margin="5" x:FieldModifier="public" />
<TextBox Margin="5" x:FieldModifier="private" />
x:Key 资源
:x:Key的作用就是为资源贴上用于检索的索引
资源
其概念和传统Web应用中的Cascading Style Sheets(CSS)样式表类似,其目的为了实现对象的重复调用。可以在不同控件或者页面定义特定的Resources, 例如,在Grid, Button定义Resources,
XAML中定义资源
的 语法格式 如下:
<根元素对象.Resources>
<资源定义 />
</根元素对象.Resources>
对在 XAML 定义的字典中创建和引用的元素进行唯一标识。 向 XAML 对象元素添加 x:Key
值是标识资源字典(例如 WPF ResourceDictionary)中资源的最常用方法。
若要在页面上使用资源字典,请在页面顶部包含一对 Resources 属性元素标记,标记扩展的主要 x:Static 用途是引用自己的代码中的静态字段或属性。
在ResourceDictionary.MergedDictionaries中定义多个外部资源文件,其查找资源顺序时由下往上逆行查找的?
作为外部资源合并,应用本身定义的资源永远具有较高的优先级,也就是说,如果在本地资源定义中,出现与rd1.xaml,rd2.xaml同名的资源, 本地资源都被会优先采用。
最自然的检索方式莫过于使用"Key-Value"对的形式了。在XAML文件中,我们可以把很多需要多次使用的内容提取出来放在资源字典中,需要用到的时候就用这个Key把它检索出来。
<Window.Resources>
<sys:String x:Key="myString">Hello WPF</sys:String>
</Window.Resources> 在XAML中访问资源<TextBox Margin="5" Text="{StaticResource ResourceKey=myString}" />
在C#中访问资源
private void Button_Click_1(object sender, RoutedEventArgs e)
{
string str = this.FindResource("myString") as string;
this.textBox2.Text = str;
}
Resources["hehe2"] = new SolidColorBrush(Colors.Red);
Application.Current.Resources["xxxx"] = new SolidColorBrush(Colors.Red);
若要在代码中查找应用范围的资源,请使用 Application.Current.Resources 获取应用的资源目录,
x:Shared:在学习x:Key时我们知道一旦我们把某些对象当作资源放进资源字典里后就可以把它检索出来重复使用,
那么,每当我们检索到一 个对象的时候,到底得到的是同一个对象,还是对象的副本呢?这就要看我们给x:Shared赋什么值了。
x:Shared一定要与x:Key配合使用, 如果x:Shared的值为true,那么得到的是同一个对象,否则x:Shared的值为false,
得到的是这个对象的一个副本。默认情况下,XAML编译器会 为资源隐藏地添加x:Shared=“true”,也就是说,默认情况下我们得到的都是同一个对象。
总结:由于在一个标签中的标签的Attribute大部分对应.NET对象的Property。在使用XAML编程的时候,如果你想给它加一点特殊的标记来改变XAML对它的解析,这时候就需要额外的给它添加一些Attribute了
标记拓展
标记扩展实际就是一些MarkupExtension类的直接或间接派生类。x名称空间中就包含一些这样的类,所以称其为x名称空间标签的标记扩展。
x:Type
顾名思义,x:Type的值是一个数据类型的名称。编程中也会用到数据类型本身。
UserWindowType="{x:Type TypeName=local:MainWindow}" />
x:Null
在c#语言里,我们用null关键字来表示空值,在XAML里我们就用x:Null来表示空值。
x:Array
x:Array的作用就是通过它的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList的成员类型由x:Array的Type指明。
<ListBox Margin="5">
<ListBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>Trim</sys:String>
<sys:String>Tom</sys:String>
<sys:String>Vitor</sys:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
x:Static:在XAML文档中使用数据类型的static成员,因为在XAML中不能写逻辑代码
public static string WindowTitle = "山高水长";
public static string ShowText { get { return "水落石出"; } }
xmlns:local="clr-namespace:统一设置一组控件的样式"
<TextBlock Text="{x:Static local:MainWindow.ShowText}"/>
XAML指令元素
x:Code
x:Code可以将逻辑代码放到XAML中运行
x:XData 把包含数据的对象成为数据源,用于把数据源中的数据提供给数据使用者的对象被称为数据提供者(Data Provider)
<Window.Resources>
<XmlDataProvider x:Key="MyData" XPath="Properties/Fruits">
<x:XData>
<Supermarket xmlns="">
<Fruit>
<Fruit Name="Peach"/>
<Fruit Name="Banana"/>
<Fruit Name="Orangle"/>
</Fruit>
<Drinks>
<Drink Name="Coca Cola"/>
<Drink Name="PEPSI Cola"/>
</Drinks>
</Supermarket>
</x:XData>
</XmlDataProvider>
</Window.Resources>
2设计类命名空间
主要是给Visual Studio 和 Expression Blend设计软件提供支持的,
命名空间3:xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
引用Expression Blend辅助设计类库,对Visual Studio和Expression Blend视图设计模式提供支持,其实际设计中主要提供设计视图页面尺寸定制。
命名空间4:xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
//该命名空间引用XAML语言辅助类库,对XAML提供辅助设计支持,
主要功能是为XAML语法解析器提供辅助解释功能,
例如,使用mc:Ignorable=“d”告知XAML解析器以“xmlns:d”为前缀的元素引用在运行时被忽略。
自定义NameSpace命名空间
xmlns[:必选映射前缀]="clr-namespace:[命名空间];assembly=[程序集名称]"
1.使用系统类
例如,如果需要添加DataGrid数据控件到项目中,
首先需要添加System.Windows.Controls.Data.dll引用文件到项目引用文件目录,
然后在页面头部声明DataGrid控件所需要的命名空间,XAML页面才能在.Net Framework中初始化该控件。
自定义声明一个命名空间:
xmlns:datagrid="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
这段代码中包含三部分的信息:
- “xmlns:datagrid”命名空间前缀名,这个前缀名可以由开发人员自定义,但是必须由“xmlns:”作为起始,也就是说,datagrid可以被任何字符替换。根据开发命名标准,推荐开发人员使用简单的控件名表示,提高代码可读性;
- “clr-namespace:System.Windows.Controls”表示该命名空间将映射到System.Windows.Controls 公共语言运行环境命名空间类;
- “assembly=System.Windows.Controls.Data"”表示DataGrid隶属于System.Windows.Controls.Data.dll动态连接库中,
完成声明后,调用方法如下:
<datagrid:DataGrid />
XAML命名空间的x:Class属性
net应用是用户界面代码和后台逻辑代码分离的。其中XAML代码用于绘制用户界面,后台逻辑代码可由开发人员喜好选择C#或者Visual Basic。XAML既然继承自XML,也就是说, 其本身不具备事件控制的代码特性。而为了使XAML能够实现与后台逻辑代码交互,则需要在XAML页面代码开始时声明x:Class属性,使其赋值当前页面对应后台页面命名空间,Runtime语法解析器将根据x:Class提供的页面命名空间名自动创建一个类,该类继承自x:Class属性隶属对象元素。完成类创建后,将判断是否该页面是否具有同名后台代码类,如果有,将合并当前生成类到后台代码类中。XAML的x:Class属性只能在页面的根元素中声明一次,表示在页面创建时,保证其包含的所有元素对象仅能被实例化一次。其声明语法格式如下:
<元素对象 x:Class=“命名空间.调用类名;assembly=程序集名称”…>
</元素对象>
下面我们尝试从实例中理解x:Class属性,在XamlGuideSL项目中,<UserControl>定义x:Class="XamlGuideSL.MainPage", 其含义是该XAML页面继承自UserControl对象元素,其对应的后台代码页面为“XamlGuideSL.MainPage.cs”,XAML语法解析器将自动检测并且链接该XAML页面到“XamlGuideSL.MainPage.MainPage.cs”,在XAML实例化时,将执行“XamlGuideSL.MainPage.cs”后台代码中的构造函数。
从Visual Studio 11默认生成后台代码中可以看出当前页面命名空间是“XamlGuideSL”,Mainpage类继承自UserControl。在构造函数MainPage()中,将执行InitializeComponent()方法,对XAML页面对象元素进行属性设置,数据绑定以及声明事件等操作。由此可见,InitializeComponent()方法在Silverlight应用初始化时具有非常重要的作用,不能从构造函数中删除。而在创建新的构造函数时,也必须调用该方法,对XAML对象元素进行实例化操作。
XAML命名空间的x:Name属性和x:Key属性
在XAML代码设计时,经常需要对控件或者资源进行命名,所需要使用的属性是x:Name和x:Key。
在实际项目中,控件元素和资源的命名规则是只在需要的时候对控件和资源进行命名操作,这样的好处有以下几点:
- 减小XAP文件或应用尺寸,加快InitializeComponent初始化调用速度;
- 易于项目维护;
XAML的x:ClassModifier属性和x:FieldModifier属性
x:ClassModifier属性和x:FieldModifier属性主要功能是支持在XAML中设置后台对应代码类存取属性.访问级别
x:ClassModifier属性仅能被用于根元素对象,例如,<UserControl>;
x:FieldModifier属性仅能被用于控件元素对象,例如,<TextBox>;
顶级元素
page
window
application
名称空间
xmlns:前缀 声明命名空间
x:class 生成了新的类