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="[单 机 我显 示信 息]" />
XAML语法及标记扩展、附加属性、特定的字符和空白的更多相关文章
- XAML 属性元素,标记扩展和注释
这节来讲一下XAML中的属性元素,标记扩展,和注释. 属性元素 一般的,我们想要对一个标签的属性赋值,可以直接在标签内部键入属性名给其赋值,如我们给button的Content属性赋值: <Bu ...
- WPF,Silverlight与XAML读书笔记(3) - 标记扩展
hystar的.Net世界 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 103 文章- 0 评论- 107 WPF,Silverlight与XAML读书笔记(3) - 标记扩展 说 ...
- 标记扩展和 WPF XAML
本主题介绍 XAML 的标记扩展概念,包括其语法规则.用途以及底层的类对象模型. 标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能. 本主题专门详细论述了用于 WPF X ...
- [No000012C]WPF(4/7)类型转换器和标记扩展[译]
介绍 之前讨论了WPF的基础架构,然后逐步开始学习布局面板,转换,介绍了不同的控件,容器,UI转换等.在这篇文章中,我将讨论每个创建XAML应用前的开发人员应该了解的关于XAML最重要的东西. 标记扩 ...
- [No0000130]WPF 4.5使用标记扩展订阅事件
自从我上次写到关于标记扩展的时候已经有一段时间了...... Visual Studio 11 Developer Preview的发布给WPF带来了一些新功能,让我有理由再次使用它们.我要在这里讨论 ...
- XAML实例教程系列 - 标记扩展(Markup Extensions) 六
XAML实例教程系列 - 标记扩展(Markup Extensions) 分类: Windows 8 Silverlight2012-06-21 13:00 1139人阅读 评论(0) 收藏 举报 扩 ...
- Xamarin.Forms移动开发系列5 :XAML标记扩展
摘要 本文主要讲述Xamarin.Forms中XAML的标记扩展. 前言 在Xamarin.Forms移动开发系列4 :XAML基础一文中提到过XAML标记扩展,本文将对标记扩展进行更深入的了解. 大 ...
- wpf中xaml的类型转换器与标记扩展
原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是可以由xaml组成的,所以标签的便利也需 ...
- XAML(4) - 标记扩展
在为元素设置值时, 可以直接设置值, 但有时标记扩展非常有帮助.标记扩展包含花括号,其后是定义了标记扩展类型的字符串标志. 下面是一个Static Resource标记扩展: <Button N ...
随机推荐
- 如何使用jQuery写一个jQuery插件
jQuery插件其实是前端框架的思维,构成一个框架,个人认为必须满足以下几个基础条件:1. 可重用,2. 兼容性,3. 维护方便,虽说现在有很多比较成熟的前端框架,但是也有部分存在配置麻烦,学习成本大 ...
- 「HNOI 2014」 江南乐
\(Description\) \(n\)堆石子,每堆石子有\(s_i\)个,两个人轮流操作,每次可以将一对不少于\(F\)的石子尽量平均分成\(m\)堆,\(m\)每次自选,不能操作者输.共有\(T ...
- 1002. 查找常用字符 leecode
题目: 给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表.例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该 ...
- Elasticsearch学习(2) windows环境下Elasticsearch同步mysql数据库
在上一章中,我们已经能够通过spring boot来使用Elasticsearch,但是由于我们习惯性的将数据写入mysql,所以为了解决这个问题,Elasticsearch为我们提供了一个插件log ...
- L365
When I started my company nine years ago, I was a young, inexperienced founder without much capital. ...
- 从哈希结构去理解PHP数组
php的数组实际上就是hash_table,无论是 数字索引数组array(1, 2, 3) 还是关联数组array(1 => 2, 2=> 4)等等. 一,这里的hash_table有几 ...
- P3267 [JLOI2016/SHOI2016]侦察守卫
$ \color{#0066ff}{ 题目描述 }$ 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的 ...
- c语言-折半查找的函数
void search(int n,int num[],char name[N][10]) { int top,bottom,middle,location,flag; top=0; bottom=N ...
- java使用freemarker导出复杂的excel表格
正常导出excel表格使用的poi,但是导出复杂的excel有点困难,但是可以使用freemaker模板来导出复杂的excel. 1.都是先生成一个Excel表格的模板,最好是增加一行数据.具体看图里 ...
- ACM-素数专题(持续更新)
埃拉托斯特尼筛法,或者叫埃氏筛法(听上去似乎很高大上的样子) #include<bits/stdc++.h> using namespace std; typedef long long ...