Wpf之Xaml属性值和特性值(一)
其实我一直很好奇在xaml中,通过Attribute=Value这种方式可以进行对元素的描述,
例如:
<Rectangle Name=” rectangle” Fill=”Blue”/>
这是一个矩形,并且利用蓝色来填充。我们知道在wpf中给UI元素上色可以用Brush(画刷),在MSDN中得知Rectangle.Fill就是一个Brush类型。
Brush类的派生类有很多,如下:
- SolidColorBrush单色画刷
- LinearGradientBrush线性渐变画刷
- ImageBrush位图画刷
- 其他
这里只列举了三种
我们知道Fill=”Blue”中的Blue只是一个字符串,但它最终被翻译成一个SolidColorBrush并赋值给了Rectangle,用c#描述是这样的:
SolidColorBrush sBrush = new SolidColorBrush(); sBrush.Color=Colors.Blue; this.rectangle.Fill=sBrush;
由于Xaml的语法限制,这里的Value只可能是字符串,重点来了。这里引出了几个问题:
- 如果一个类使用Xaml语言声明,并允许它的Property(属性)与Xaml标签的Attribute(特征)互相映射,那就需要为这些Property添加一个转换机制
- 由于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属性值和特性值(一)的更多相关文章
- WPF动画之后属性值无法改变
原文:WPF动画之后属性值无法改变 前一段时间使用WPF写2048游戏的时候,遇到下面的情形:使用按键对色块进行移动时,触发位置左边X和Y属性的DoubleAnimation动画,但是 ...
- WPF当属性值改变时利用PropertyChanged事件来加载动画
在我们的程序中,有时我们需要当绑定到UI界面上的属性值发生变化从而引起数据更新的时候能够加载一些动画,从而使数据更新的效果更佳绚丽,在我们的程序中尽量将动画作为一种资源放在xaml中,而不是在后台中通 ...
- XAML属性赋值转换之谜(WPF XAML语法解密)
XAML与XML类似,就是XML延伸过来的.为了更好的表达一些功能,WPF对XML做了扩展,有些功能是WPF在后台悄悄的替你做了.有时候,虽然实现了某个功能,但是对实现原理还是很茫然.今天就讲讲XAM ...
- WPF依赖属性值源(BaseValueSource)
原文:WPF依赖属性值源(BaseValueSource) WPF依赖属性提供一个机制,可以获取依赖属性提供值的来源 其以BaseValueSource枚举表示 1.Default public ...
- [WPF系列]-数据邦定之DataTemplate 使用 DataTrigger 来应用属性值
使用 DataTrigger 来应用属性值 当前表示不会告诉我们某个 Task 是家庭任务还是办公室任务.记住 Task 对象拥有类型为 TaskType 的 TaskType 属性,该类型是一个枚举 ...
- WPF入门:XAML
XAML是WPF技术中专门用于设计UI的语言 XAML优点最大的优点是将UI与逻辑代码剥离 创建第一个WPF应用程序 VS默认生成的WPF项目解决方案 Properties:里面主要包含了程序用到的一 ...
- WPF DataGrid常用属性记录
WPF DataGrid常用属性记录 组件常用方法: BeginEdit:使DataGrid进入编辑状态. CancelEdit:取消DataGrid的编辑状态. CollapseRowGroup:闭 ...
- [转]WPF 依赖项属性
from:http://blog.csdn.net/datoumimi/article/details/8033682 ps:环境限制,发的东西一长就会被拦截,所以删了一部分 UI软件中经常会用到大量 ...
- WPF利用依赖属性和命令编写自定义控件
以实例讲解(大部分讲解在代码中) 1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试, <UserControl x:Class="SelfControlD ...
随机推荐
- WPF中通过代码设置控件的坐标
用WPF做贪吃蛇小游戏时,发现了一个问题: 贪吃蛇的移动,我是通过不断刷新Rectangle来实现(贪吃蛇的身体由一组Rectangle组成),因此需要不断调整Rectangle的坐标,但是WPF中没 ...
- 在Ubuntu14.04安装torch7笔记
http://www.linuxdiyf.com/linux/18979.html 附编译例子: https://github.com/vic-w/torch-practice
- EF之ExecuteSqlCommand更新出现无效的解决方案
本篇文章将会剖析为什么会出现这一现象.以及解决的办法 先来看一下代码 public static TResult AddTest() { TestDAL testdal = DALFactory.Cr ...
- javascirpt对象运用与JS变量
abcdefghijklmnopqrstuvwyz String 对象方法 charAt() 方法可返回指定位置的字符.stringObject.charAt(index)(index从0开始)[ht ...
- C# HttpWebRequest GET HTTP HTTPS 请求
下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需要获取认证信息(如Cookie),所以返回的是HttpWebResponse ...
- Web String path问题
request.getContextPath()"下方出现了红色的波浪线,提示的错误信息是 "The method getContextPath() from the type H ...
- 自己常用JS和JQ 函数
//验证码函数 <button id="send">点击发送验证码</button> <script src="jquery.min.js& ...
- SQL知识整理三:变量、全局变量、视图、事务、异常
变量 1.局部变量的声明(一个@) declare @n int --声明变量关键字为declare 然后@加变量名 后面是变量类型 declare @s varchar(36) 2 ...
- python走起之第十五话
CSS Positioning(定位) 定位有时很棘手! 决定显示在前面的元素! 元素可以重叠! Positioning(定位) CSS定位属性允许你为一个元素定位.它也可以将一个元素放在另一个元素后 ...
- ichart.js绘制虚线 ,平均分虚线
var Data=new Array(); Data[0] = { labels : ["第一单元","第二单元","第三单元"," ...