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 ...
随机推荐
- WSGI与uWSGI的应用场景与使用方法
WSGI /与/ uWSGI 在阿里云上部署项目时,在通信中我们都会用到wsgi与uWSGI,这此我就带大家来了解一下wsgi与uWSGI. 对了,上次有个朋友问我Django的生命周期是什么?我 ...
- mpvue快速入门
主要特性 使用 mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力: 彻底的组件化开发能力:提高代码复用性 完整的 Vue.js 开发体验 方便的 Vuex 数据管理方案:方便构建 ...
- SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控
本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.Actuator简介 1.监控组件作用 在生产环境中,需要实时 ...
- PAT 1003 Emergency 最短路
As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...
- Ling to sql 多表查询,多个条件进行关联
使用多表查询进行关联时,提示 join子句中其中一个表达式的类型不正确,注意字段类型和名称要一致,否则join时提示语法错误,错误截图如下 var incomeDetails = from a in ...
- Zimbra
第一步:利用XXE读取配置文件 这里利用了CVE-2019-9670漏洞来读取配置文件,你需要在自己的VPS服务器上放置一个dtd文件,并使该文件能够通过HTTP访问.为了演示,我在GitHub上创建 ...
- RDIFramework.NET敏捷开发框架WinForm新增文件中心-实现附件集中管理
1.引言 文件中心类似附件管理是一个非常实用功能,可以归档自己平时所需要的文件,也可以把文件分享给别人,更像一个知识中心.文件中心主界面如下图所示,左侧"附件分类"展示了用户对文件 ...
- [20191106]善用column格式化输出.txt
[20191106]善用column格式化输出.txt # man columnDESCRIPTION The column utility formats its input into mu ...
- Python虚拟环境导出包安装到另一台电脑的方法
环境:Windows 版 Python Python 3.6.8可以用自带的命令建立虚拟环境,不用安装另外的如 virtualenv.virtualenvwrapper等工具. python -m v ...
- 8. java 面向对象
一.面向对象特征 1. 封装 方法就是一种封装 关键字private也是一种封装 封装就是讲一些逻辑细节信息隐藏起来,对于外界不可见:外界只需调用我即可: 一旦使用了private进行修饰,那么本类当 ...