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 ...
随机推荐
- C# 等待框
今天发现dev控件自带了等待框,调用方便,而且不会阻塞主线程. 拉一个窗体,界面上放两个按钮,显示等待框,隐藏. <Window x:Class="WaitDialogTest.Mai ...
- OCP题库变了,2018年052新题库-29题
29.In one of your databases: * The database default tablespace is EXAMPLE. * Deferred_segment_creati ...
- Binaries和Source、tgz和zip的区别
在下载页面会有2种下载分类,一个是Binaries,一个是source,一般开放原代码软件都会有两个版本发布: Source Distribution 和 Binary Distribution ,二 ...
- 题目1016:火星A+B(字符串拆分)
问题来源 http://ac.jobdu.com/problem.php?pid=1016 问题描述 每次输入两个数,不同数位之间用逗号隔开,其中,第n位的进制就是第n个素数,即个位数是2进制的,十位 ...
- JavaWeb后台从input表单获取文本值的两种方式
JavaWeb后台从input表单获取文本值的两种方式 #### index.html <!DOCTYPE html> <html lang="en"> & ...
- git克隆和上传项目
软件环境: 1. VS2017 2. Git ver 2.17.0.1 3. gitee.com 目的: 已有的本地项目(新建)上传到码云,使本地可以和码云同步 尝试: 先在码云上建立项目,项目名称和 ...
- 2. Javscript学习笔记——引用类型
2. 引用类型 2.1 Object类型 Object 是一个基础类型,其他所有类型都从 Object 继承了基本的行为. 对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象 ...
- 阿里实人认证 .net 准备工作
1.H5+服务端接入 认证方案 https://help.aliyun.com/document_detail/61362.html?spm=a2c4g.11186623.2.37.35247556k ...
- lua路径问题
方法1:lua进行require绝对路径时,会从package.path中进行遍历 print(package.path)会得到类似下面的结果: --> "lualibs/p4ulib ...
- es第十篇:Elasticsearch for Apache Hadoop
es for apache hadoop(elasticsearch-hadoop.jar)允许hadoop作业(mapreduce.hive.pig.cascading.spark)与es交互. A ...