其实我一直很好奇在xaml中,通过Attribute=Value这种方式可以进行对元素的描述,

例如:

<Rectangle Name=” rectangle” Fill=”Blue”/>

这是一个矩形,并且利用蓝色来填充。我们知道在wpf中给UI元素上色可以用Brush(画刷),在MSDN中得知Rectangle.Fill就是一个Brush类型。

Brush类的派生类有很多,如下:

  1. SolidColorBrush单色画刷
  2. LinearGradientBrush线性渐变画刷
  3. ImageBrush位图画刷
  4. 其他

这里只列举了三种

我们知道Fill=”Blue”中的Blue只是一个字符串,但它最终被翻译成一个SolidColorBrush并赋值给了Rectangle,用c#描述是这样的:

SolidColorBrush sBrush = new SolidColorBrush();

sBrush.Color=Colors.Blue;

this.rectangle.Fill=sBrush;

由于Xaml的语法限制,这里的Value只可能是字符串,重点来了。这里引出了几个问题:

  1. 如果一个类使用Xaml语言声明,并允许它的Property(属性)与Xaml标签的Attribute(特征)互相映射,那就需要为这些Property添加一个转换机制
  2. 由于Value是字符串类型,所以它的格式复杂程度有限,尽管可以在转换机制里面包含一定的按格式解析字符串的功能以便转换成复杂的目标对象,但这会让最终的XAML使用者头疼不已。因为他们不得不在没有编码辅助的情况下手写一个格式复杂的字符串以满足赋值要求

第一个问题可以通过TypeConvert类的派生类,在派生类重写TypeConverter的一些方法,第二个问题的解决方法就是使用属性元素(PropertyElement

先看个例子:

public class Human

{

public string Name{get;set;}

pubic Human Child{get;set;}
}

Human类中Name是字符串类型,Child是Human类型

假设我在Xaml这样写:

<Window.Resources>

       <local:Human x:Key=”human” Child=”AAA”/>

</ Window.Resources >

我对Child赋了一个字符串类型,我期望的是Child的Name属性的值是AAA,下面我们来看一下这个Child究竟会发生什么情况。

Human h=(Human)this.FindResources(“human”);

MessageBox.Show(h.Child.Name);

编译没问题,但当运行时程序会抛出异常,Child为null。很明显编译器不懂如何把一个字符串转换成一个Human实例,我们应该怎么办呢?下面终于轮到我们提及的TypeConvert出场了。看代码,我们先从TypeConvert派生一个类StringToHumanTypeConvert。

public class StringToHumanTypeConvert: TypeConvert
{
public overrid object ConvertFrom(ItypeDescriptorContext context,
System.Globalization.CultrueInfo culture,object value)
{
If(value is string)
{
Human h=new Human();
h.Name=value as string;
return h;
}
return base.ConvertFrom(context,culture,value);
}
}

我们重写了它的一个方法ConvertFrom,这个方法有一个参数名为value,这个值就是在Xaml文档里为它设置的值我们要做的就是把这个值”翻译成合适类型的值赋给对象的属性。完成了转换过程,我们需要把这个转换绑到Human类上面,可以使用TypeConvertAttribute这个特征

[TypeConvertAttribute(typeof(StringToHumanTypeConvert))]
public class Human
{
public string Name{get;set;}
pubic Human Child{get;set;}
}

凡是特征类都可以省略Attribute这个词,所以上面的代码可以简写成

[TypeConvert
(typeof(StringToHumanTypeConvert))]

需要注意这里的TypeConvert是一个特征,它的全名是TypeConvertAttribute,他并不是TypeConvert类。

TypeConvert类的使用远远不只重在一个ConvertFrom方法那么简单,为了配合这个方法的运行,还需要重在其他的几个方法。详细使用请自行查阅MSDN。

这里只提到第一个问题是怎样实现,第二个问题怎样解决会在下次说明。大部分知识都是在《深入浅出WPF》一书中整理,最近在学习WPF控件编程,这些知识都是很有用。

Wpf之Xaml属性值和特性值(一)的更多相关文章

  1. WPF动画之后属性值无法改变

    原文:WPF动画之后属性值无法改变         前一段时间使用WPF写2048游戏的时候,遇到下面的情形:使用按键对色块进行移动时,触发位置左边X和Y属性的DoubleAnimation动画,但是 ...

  2. WPF当属性值改变时利用PropertyChanged事件来加载动画

    在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通 ...

  3. XAML属性赋值转换之谜(WPF XAML语法解密)

    XAML与XML类似,就是XML延伸过来的.为了更好的表达一些功能,WPF对XML做了扩展,有些功能是WPF在后台悄悄的替你做了.有时候,虽然实现了某个功能,但是对实现原理还是很茫然.今天就讲讲XAM ...

  4. WPF依赖属性值源(BaseValueSource)

    原文:WPF依赖属性值源(BaseValueSource)   WPF依赖属性提供一个机制,可以获取依赖属性提供值的来源 其以BaseValueSource枚举表示 1.Default public ...

  5. [WPF系列]-数据邦定之DataTemplate 使用 DataTrigger 来应用属性值

    使用 DataTrigger 来应用属性值 当前表示不会告诉我们某个 Task 是家庭任务还是办公室任务.记住 Task 对象拥有类型为 TaskType 的 TaskType 属性,该类型是一个枚举 ...

  6. WPF入门:XAML

    XAML是WPF技术中专门用于设计UI的语言 XAML优点最大的优点是将UI与逻辑代码剥离 创建第一个WPF应用程序 VS默认生成的WPF项目解决方案 Properties:里面主要包含了程序用到的一 ...

  7. WPF DataGrid常用属性记录

    WPF DataGrid常用属性记录 组件常用方法: BeginEdit:使DataGrid进入编辑状态. CancelEdit:取消DataGrid的编辑状态. CollapseRowGroup:闭 ...

  8. [转]WPF 依赖项属性

    from:http://blog.csdn.net/datoumimi/article/details/8033682 ps:环境限制,发的东西一长就会被拦截,所以删了一部分 UI软件中经常会用到大量 ...

  9. WPF利用依赖属性和命令编写自定义控件

    以实例讲解(大部分讲解在代码中) 1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试, <UserControl x:Class="SelfControlD ...

随机推荐

  1. php变量 写时改变 写时复制

    写时复制 $var = 1; $var2 = $var; #此时$var2 与 $var 指向同一个zval refcount = 2: $var = 2; # 此时$val 改变 所以 $var 与 ...

  2. jsp中button与submit的用法

    button:可以对返回的数据进行格式化,反应到页面上,可以用form表单序列化提交也可以不用form表单提交 <form id="addForm"> <inpu ...

  3. NetSuite SuiteScript 2.0 export data to Excel file(xls)

    In NetSuite SuiteScript, We usually do/implement export data to CSV, that's straight forward: Collec ...

  4. Linux 视频设备驱动V4L2最常用的控制命令

    http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...

  5. R语言基本操作函数---变量的基本操作

    1.变量变换        as.array(x),as.data.frame(x),as.numeric(x),as.logical(x),as.complex(x),as.character(x) ...

  6. nfs 配置

    服务端1.打印系统版本cat /etc/redhat-release2.检查并安装NFS服务rpm -aq nfs-utils portmap rpcbindyum grouplistyum grou ...

  7. 阅读笔记 火球UML大战需求分析3

    在复习回顾的以前所学的UML 统一建模语言之后,要将他们融会贯通起来,必定要进行一次事件,这样才能更好地运用各种UML,所以,了解了所有的UML图之后,就要开始接收一个练习的项目了. 这里作者给的例子 ...

  8. GridView数据绑定

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs& ...

  9. XPath使用实例

    实例 1基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径 //BBB           选择所有BBB元素 /AAA/CCC 选择 ...

  10. CentOS搭建NodeJS环境

    事件驱动,承受高并发……这些耀眼的光环,使前端开发者不能不去学习NodeJS. 今天就在开发环境把NodeJS搭建起来了. 1. 下载node wget http://nodejs.org/dist/ ...