XAML属性和事件
1、元素属性
XAML是一种声明性语言,XAML编译器会为每一个标签创建一个与之对应的对象。对象创建出来之后要对它的属性进行必要的初始化之后才有使用意义。
因为XAML语言不能写程序运行逻辑,所以一份XAML文档除了使用标签声明对象,另外一个功能就是初始化对象的属性了。
在XAML中为对象属性赋值共有两种方法:
- 使用字符串进行简单赋值;
- 使用属性元素进行复杂赋值。
2、使用标签的Attribute为对象属性赋值
我们已经知道,标签中的Attribute里面有一部分与对象的Property互相呼应。
我们首先学习使用字符串对Attribute进行简单赋值,将Rectangle填充成单一的颜色。
<Grid>
<Rectangle Name="Myrectangle" Width="100" Height="100" Fill="Aqua"></Rectangle>
</Grid>
在XAML编译器中,“Aqua” 这个字符串被翻译成了一个SolidColorBrush对象并赋值给了Myrectangle对象。翻译成C#代码就是:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
SolidColorBrush colorBrush = new SolidColorBrush();
colorBrush.Color = Colors.Aqua;
Myrectangle.Fill = colorBrush;
}
3、使用TypeConverter类进行属性映射
在上面的例子中我们使用Attribute=Value语法赋值时,由于XAML语法限制,Value只能是一个字符串值。那么就会引发两个问题:
- 如果一个类能使用XAML语言进行声明,并允许它的Property与XAML标签的Attribute互相映射,那么就需要为这个类的Property准备适当的转换机制。
- 由于Value是一个字符串,所以其格式复杂程度有限。面对格式复杂的字符串就难以满足赋值需求。
我们举一个简单的栗子来演示第一个问题:下面的代码XAML编译器会给我们提示无法将字符串转换成Huamn类型。
<Window.Resources>
<my:Human x:Key="human" Child="DSA" />
</Window.Resources>
(1)属性转换
使用TypeConverter的派生类,在派生类里面重写TypeConverter的一些方法最终来解决转换问题:
- 准备一个我们自定义的类Human。
- 新建一个实现了TypeConverter接口的类。
- 在Human类的首部加上[TypeConverterAttribute(typeof(StringToHumanTypeConverter))]特性。
自定义Human类:
[TypeConverterAttribute(typeof(StringToHumanTypeConverter))]
public class Human
{
public string Name { get; set; }
public Human Child { get; set; }
}
TypeConverter派生类:
public class StringToHumanTypeConverter : TypeConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
Human human = new Human();
human.Name = value as string;
return human;
}
return base.ConvertFrom(context, culture, value);
}
}
通过以上操作我们就将普通字符串翻译成合适类型的值并赋值给元素的属性。
(2)属性元素进行复杂赋值
在XAML中,每个子级标签都是父级标签内容的一个元素,简称父级标签的一个元素。
属性元素是指:某个标签的一个元素对应了该标签的一个属性,即属性元素是以元素的形式表达了一个实例的属性。
我们使用代码可以描述为:
下面给出一个使用属性元素的简单的代码示例:
<Rectangle Name="Myrectangle" Width="100" Height="100" >
<Rectangle.Fill>
<SolidColorBrush Color="Aqua"/>
</Rectangle.Fill>
</Rectangle>
(3)使用属性元素的好处
虽然使用字符串为对象属性赋值与使用属性元素为对象属性赋值相比,属性元素的代码会比较冗长,但这仅是相较比较简单的属性赋值而言的。遇到属性复杂的对象时,属性元素的好处就体现出来了。比如我们使用渐变画刷填充矩形。
<Rectangle Name="Myrectangle" Width="100" Height="100">
<Rectangle.Fill>
<LinearGradientBrush>
<LinearGradientBrush.StartPoint>
<Point X="0" Y="0"></Point>
</LinearGradientBrush.StartPoint>
<LinearGradientBrush.EndPoint>
<Point X="1" Y="1"></Point>
</LinearGradientBrush.EndPoint>
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0.2" Color="LightCyan"/>
<GradientStop Offset="0.4" Color="AliceBlue"/>
<GradientStop Offset="0.7" Color="Blue"/>
<GradientStop Offset="0.9" Color="Red"/>
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
XAML代码效果图:
XAML属性和事件的更多相关文章
- WPF中XAML的触发器的属性,事件 都有那些?以及如何寻找
在编写XAML的触发器时,会有属性,事件. 那么这些都是哪里来的呢? 属性,是附加属性或者依赖属性 事件,那就是事件. 如何寻找呢? 很简单,在想要使用的触发器的对象上(也就是有光标的时候)按下F12 ...
- XAMl中使用事件
在XAMl代码中,尽管属性设置通常占据了大量代码量,也可以在XAMl中声明事件,事件的声明通常使用事件名=“事件处理方法名称”,并且在后置代码中,需要对指定的后置代码提供声明和实现 而且方法的签名也需 ...
- Silverlight实例教程 - Validation数据验证基础属性和事件(转载)
Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...
- HTML5 Audio/Video 标签,属性,方法,事件汇总
HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48 <audio> 标签属性:src:音乐的URLpreload:预加载au ...
- [转]jqGrid 属性、事件全集
本文转自:http://blog.csdn.net/rosanu_blog/article/details/8334070 以下是jqGrid 最常用的属性和事件,经过一段时间的整理,终于弄的差不多了 ...
- combobox 属性、事件、方法
一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...
- HTML5全局属性和事件
全局属性和事件能够应用到所有标签元素上,在HTML4中有许多全局属性,比如id,class等.HTML5中又新增了一些特殊功能的全局属性和事件. 属性: HTML5属性能够赋给标签元素含义和语 ...
- C#中combobox 控件属性、事件、方法
一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...
- HTML 标准属性 和 事件属性
HTML的公共属性 HTML 和 XHTML 标签支持的标准属性 核心属性 (Core Attributes) 以下标签不提供下面的属性:base.head.html.meta.param.scrip ...
随机推荐
- Redis令牌桶限流
一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...
- redis的embstr编码
问题来了 今天在看书籍<Redis设计与实现>的时候,在8.2字符串对象里面写到 如果字符串对象保存的是一个字符串值, 并且这个字符串值的长度大于 39 字节, 那么字符串对象将使用一个简 ...
- 读后感:数据结构与算法JavaScript描述
本书看完,对常见的数据结构与算法从概念上有了更深入的理解. 书中关于数组.栈和队列.链表.字典.散列.集合.二叉树.图.排序.检索.动态规划.贪心算法都有详细的介绍.算是一本不错的学习书籍. 栈和队列 ...
- 整理了8个Python中既冷门又实用的技巧
1.print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设置 ...
- docker: manifest for elasticsearch:latest not found
今天在docker安装es出现坑,是这样. 使用: docker pull elasticsearch 提示:manifest for elasticsearch:latest not found如图 ...
- LInux:服务的管理-systemctl
使用systemctl管理服务 服务的启动与停止 服务的启动与停止 命令格式:systemctl 选项 服务名 选项说明: start:启动;stop:停止:restart:重启:status:服务状 ...
- Python添加邮件附件并通过邮件发送测试报告
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText c ...
- [数组] Leetcode 189.旋转数组
- 关于jvm的常识介绍
1.关于jvm的组成(只介绍1.8,以前的版本不多介绍) vm stack,native method stack,program counter register,heap,metaspace 2. ...
- SP2713 GSS4 - Can you answer these queries IV 分块
问题描述 LG-SP2713 题解 分块,区间开根. 如果一块的最大值是 \(1\) ,那么这个块就不用开根了. 如果最大值不是 \(1\) ,直接暴力开就好了. \(\mathrm{Code}\) ...