其实我一直很好奇在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. android ViewPager使用遇到的问题

    项目需求是需要实现一个有两页可滑动的界面,就想到了使用ViewPager,在实现是没有深入考虑,就直接使用了PagerAdapter,页面是正常实现了,可是发现无法流畅的刷新页面(直接使用notify ...

  2. flag+文件操作

    flag标志位,标识位,在其他语言中可能叫开关,个人觉得当作开关更容易理解.下面我们来利用这个开关来控制文件操作的流程,从而优雅的修改配置文件. global log 127.0.0.1 local2 ...

  3. mysql压缩包安装配置

    1.在环境变量中添加:MYSQL_HOME:C:\05_study\mysql-5.7.10-winx64,在path路径中加入:%MYSQL_HOME%\bin.配置环境变量不是必须的,只是为了能更 ...

  4. System Setup

    vistual studio 2013 download: http://www.microsoft.com/en-us/download/details.aspx?id=48138 http://w ...

  5. build/envsetup.sh 生成的命令详解表

    参考: https://wiki.cyanogenmod.org/w/Envsetup_help 它是一个.sh文件,用source后就生成android编译相关函数,具体如下. 速查 Invokin ...

  6. 如何使用xshell远程连接ubuntu

    在Ubuntu上安装ssh就可以使用xshell登录了,安装步骤: 1,sudo apt-get install openssh-server 2,然后启动ssh sudo /etc/init.d/s ...

  7. NSUserDefaults的使用

    创建一个user defaults方法有多个,最简单得快速创建方法: NSUserDefaults *accountDefaults = [NSUserDefaultsstandardUserDefa ...

  8. \r与\n的区别

    \r : return 到当前行的最左边. \n: newline 向下移动一行,并不移动左右. Linux中\n表示回车+换行: Windows中\r\n表示回车+换行. Mac中\r表示回车+换行 ...

  9. [linux] scp无密码拷贝

    源服务器为s,ip为111.111.111.112. 目标服务器为d, ip为111.111.111.111 1>在源服务器新建用户 test_s, useradd test_s -g user ...

  10. java文章显示内容部分(将html转成纯文本)

    public static String splitAndFilterString(String input, int length) { if (input == null || input.tri ...