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属性和事件的更多相关文章

  1. WPF中XAML的触发器的属性,事件 都有那些?以及如何寻找

    在编写XAML的触发器时,会有属性,事件. 那么这些都是哪里来的呢? 属性,是附加属性或者依赖属性 事件,那就是事件. 如何寻找呢? 很简单,在想要使用的触发器的对象上(也就是有光标的时候)按下F12 ...

  2. XAMl中使用事件

    在XAMl代码中,尽管属性设置通常占据了大量代码量,也可以在XAMl中声明事件,事件的声明通常使用事件名=“事件处理方法名称”,并且在后置代码中,需要对指定的后置代码提供声明和实现 而且方法的签名也需 ...

  3. Silverlight实例教程 - Validation数据验证基础属性和事件(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  4. HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48   <audio> 标签属性:src:音乐的URLpreload:预加载au ...

  5. [转]jqGrid 属性、事件全集

    本文转自:http://blog.csdn.net/rosanu_blog/article/details/8334070 以下是jqGrid 最常用的属性和事件,经过一段时间的整理,终于弄的差不多了 ...

  6. combobox 属性、事件、方法

    一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...

  7. HTML5全局属性和事件

    全局属性和事件能够应用到所有标签元素上,在HTML4中有许多全局属性,比如id,class等.HTML5中又新增了一些特殊功能的全局属性和事件.   属性:   HTML5属性能够赋给标签元素含义和语 ...

  8. C#中combobox 控件属性、事件、方法

    一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...

  9. HTML 标准属性 和 事件属性

    HTML的公共属性 HTML 和 XHTML 标签支持的标准属性 核心属性 (Core Attributes) 以下标签不提供下面的属性:base.head.html.meta.param.scrip ...

随机推荐

  1. 集合系列 Set(七):LinkedHashSet

    LinkedHashSet 继承了 HashSet,在此基础上维护了元素的插入顺序. public class LinkedHashSet<E> extends HashSet<E& ...

  2. 图解SynchronousQueue原理-公平模式

    SynchronousQueue原理详解-公平模式 一.介绍 SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对Sync ...

  3. Maven使用之packaging类型

    项目的打包类型:pom.jar.war 项目中一般使用maven进行模块管理,每个模块下对应都有一个pom文件,pom文件中维护了各模块之间的依赖和继承关系.项目模块化可以将通用的部分抽离出来,方便重 ...

  4. swool安装(centos7)

    1:获取swoole https://github.com/swoole/swoole-src/releases http://pecl.php.net/package/swoole http://g ...

  5. 通过Shell脚本来创建批量服务器上的MySQL数据库账号

    1.项目背景 因监控需要,我们需要在既有的每个MySQL实例上创建一个账号.公司有数百台 MySQL 实例,如果手动登入来创建账号很麻烦,也不现实.所以,我们写了一个简单的shell脚本,用来创建批量 ...

  6. fastadmin安装定时插件报错 ZipArchive::extractTo(): Permission denied

    环境linux上直接安装  如果你是在win开发号直接部署的应该是没问题  我是直接在linux安装的 这几天研了下fastadmin 想用他的定时可是在使用的时候报错   ZipArchive::e ...

  7. MYSQL的基本使用,以及错误代码的意思

    创建数据库: 要创建声明类型的数据库,输入CREATE DATABASE 数据库名称; 注意:命令不必以大写字母输入. 注意:所有MySQL命令必须以";"结束.如果忘记了输入分号 ...

  8. CodeForces - 1251D (贪心+二分)

    题意 https://vjudge.net/problem/CodeForces-1251D 您是一个大型企业的负责人.在您的企业当中共有n位员工为您工作,而且非常有趣的事是这个n是一个奇数(n不能被 ...

  9. python简单处理excel方法

    python自带xlrd和xlwt模块用来处理excel,但总觉得xlwt模块用着别扭,于是按自己的习惯重新封装了一个 # coding=utf- import xlrd # 读模块 import x ...

  10. 挑战编程 uva100 3n+1

    挑战编程 刘汝佳 的第一道习题  热身题 熟悉下提交格式 题意 #include <iostream> #include <algorithm> using namespace ...