XAML语法及标记扩展、附加属性、特定的字符和空白
1.对象元素语法
使用开闭标签将对象定义一个XML元素,这种语法与其他标记语言如HTML的元素语法非常相似,在以左右尖括号保卫要设置的类或结构的类型名称。对象元素可以声明0个或多个属性,以一个或多个空格来分割每个“属性名=值“
对,例如 下面使用对象元素语法设置一个TextBox对象并设置其Content和FontSize属性和命名空间
<TextBox FontSize="10">这是一个textBox控件</TextBox> <textbox> </textbox> <textbox /> 这个样才是一个对象
2.属性语法
属性语法对于简单类型的属性赋值场合非常便利,但是对于一些本身就是复杂类型的属性来说,使用属性语法会有些难于理解,甚至难于实现
一个比较单行的复杂属性是Background属性,通常使用如下的语法来为UI是对象设置背景色如下
<Button Content="登录" Background="Red" ></Button>
这里直接为Background赋一个颜色值,XAML解析器会使用BrushConverter转换器将这个字符串转换为一个Brush类的派生对象。在.NET中,Brush类实际上是一个抽象类,因此对于Background属性
也可以使用渐变画刷,如果需要为背景设置渐变,使用上面的属性语法代码是很困难的,所幸的是XAML也提供了另外一种属性的方法。
3.属性元素语法
属性元素语法允许在元素累不使用”元素名.属性名“的语法来设置复杂的属性,类似于一个元素中的子元素一样。例如 上面设置单色背景的属性语法,也可以改用属性元素语法来设置
<Button Content="登录" > <Button.Background> <SolidColorBrush Color="Red" /> </Button.Background> </Button>
如果使用vs设置属性元素语法,会发现在<button.Background>属性元素之间,提供了多种可供设置的属性看。如果非要走极端也可以这么写
<Button Content="登录" > <Button.Background> <SolidColorBrush> red </SolidColorBrush> </Button.Background> </Button>
标记扩展特性
在一些情况下,属性的值并不能再编写代码时就能够知道,可能需要在运行时由程序产生,或者由用户产生。或者说,开发人员希望从一个已经存在的空间的某个值来设置其他空间属性值。
标记扩展可以使用在内嵌元素标记或者是XAML属性语法中,对于属性语法,通常使用大括号包围其语法。而对于属性元素语法,标记扩展在外观上与其他任何用于提供属性元素之的元素相同,即一个将标记扩展类作为一个元素引用并以尖括号(<>)扩起的
XAML元素声明。下面使用属性语法来应用标记扩展,在代码中将为Button 的前景色职位为SystemColor类中的静态属性ActiveCaptionBrush
<Button Content="登录" Background="{x:Static SystemColors.ActiveBorderBrush}" />
这段代码中,标记扩展使用{MarkupExtension 派生类 参数}。在本例中标记扩展是一个StaticExtension类。X前缀指示StaticExtencion可以在XAMl命名空间中找到,也有很多标记扩展属于WPF命名空间,因此没有X前缀。
使用属性元素语法
<Button Content="登录"> <Button.Foreground> <x:Static Member="SystemColors.ActiveCaptionBrush"></x:Static> </Button.Foreground> </Button>
附加属性
附加属性是指定义在不同类中的属性可以被应用到其他的控件。在WPF中,附加属性常常用来作为布局属性。
在WPF中,每个控件都有其内在的属性,比如,一个文本框控件有特定的字体、颜色和文本内容等,但是当将这个控件放到一个容器控件中时,依赖于不同的容器
控件能够进行一些在影响控件在容器中的特性的属性设置,这通常通过添加附加属性来进行设置。
附加属性使用两部分的语法表示形式:类型定义.属性名称,使用这种命名方式,XAML解析器能够区别标准属性与附加属性。下面演示附加属性的一个用法
假定想要为StackPanel中的textblock对象设置字体的大小,可以使用下列代码
<StackPanel TextBlock.FontSize="18"> <TextBlock >这个是一个block控件</TextBlock> <TextBlock FontSize="9">这个是第二个控件</TextBlock> </StackPanel>
以上代码为Stackpanel指定了一个Textblock.FontSize附加属性,指定了字体为18,可以看到,如果不单独指定textblock的字体大小,则会使用Stackpanel中定义的大小
附加属性其实并不是属性,他们实际上会被转换为方法调用,XAMl解析器经调用一组静态方法,这些方法一DefiningType.SetPropertyName(也就是类型.SET属性)
的形式进行调用,因此,对于上面XAMl代码,也可以使用如下的C#程序代码来设置附加属性
private void Window_Loaded(object sender, RoutedEventArgs e) { TextBlock.SetFontSize(stackpanel1,40); }
为了在代码中Stackpanel对象应用附加属性,在XAMl中需要为其设置Name属性
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBlock >Hello</TextBlock> <TextBox Text="注销" Grid.Column="0" Grid.Row="1" ></TextBox> <TextBox Text="登录" Grid.Column="1" Grid.Row="0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/> </Grid>
以上代码是用grid的附加属性为元素添加了布局,也可以使用如下代码来进行布局的设置,下面将这段XAMl代码稍加更改,去掉附加属性的设置,然后再Windows构造函数中添加代码
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Grid.SetColumn(tb1,0); //设置textBlock为第0行,第0列 Grid.SetRow(tb1,0); Grid.SetRow(tb2,1); Grid.SetColumn(tb2,0); Grid.SetColumn(tb3,2); Grid.SetRow(tb3,1); }
当谁用这种程序代码语法的时候,需要传递两种参数,要被修改的对象,比如,上面的示例是要修改textblock对象的位置,然后特定的属性值。
5 特定的字符和空白
XAMl严格遵顺XML语法规范。在XML中,对于特定的字符,比如&、<、>、等,需要进行特别的处理。下面的XAML代码希望在按钮中显示“<点击我显示信息>”这行文字
在程序中显示出错误的信息,提示<单击我显示信息> 不存在与XML命名空间中,
XAML解析器会把<>内的字符串视为一个子元素,并试着进行创建,结果当然产生了出错的信息。正常的解决方法是使用特定的代码替换这些字符,XAMl将把这些特定的代码解析问哦正确的字符串,可以使用以下几个特定
的字符
- 小于符号<:<;
- 大于符号>:>;
- AND符号&:&;
- 引号“”:";
对于上面的代码中要在Button的内容区中显示大于和小于符号,可以替换为如下代码
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBlock Name="tb1">Hello</TextBlock> <TextBox Text="注销" Name="tb2" ></TextBox> <TextBox Text="<单机我显示信息>" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="tb3"/> </Grid>
另外一个需要特别注意的是XAMl中的空格。默认情况下,XML将收缩所有的空格。这意味着对于一个包含空格、Tab以及回车的字符串来说将收缩为一个空格。或者如果元素内容的前面或后面添加了空格
这些空格将会被完全的忽略。
TextBlock Name="tb1">Hello</TextBlock> <TextBox Text="注销" Name="tb2" ></TextBox> <TextBox Text="<单机我显示信息>" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="tb3"/> <TextBlock Grid.Column="1">[单击 我显示 信 息]</TextBlock>
有两种方法解决:
1.可以在元素中添加代码实现保留空格 xml:space="preserve"
<TextBlock Name="tb1">Hello</TextBlock> <TextBox Text="注销" Name="tb2" ></TextBox> <TextBox Text="<单机我显示信息>" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="tb3"/> <TextBlock Grid.Column="1" xml:space="preserve">【单 击我显示信 息】</TextBlock>
2.可以使用属性语法来给元素赋值
<TextBlock Name="tb1">Hello</TextBlock> <TextBox Text="注销" Name="tb2" ></TextBox> <TextBox Text="<单机我显示信息>" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="tb3"/> <TextBlock Grid.Column="1" Text="[单 机 我显 示信 息]" />