Wpf之Xaml属性值和特性值(一)

摘要:
这里提出了几个问题:如果一个类是用Xaml语言声明的,并且允许其属性与Xaml标记的属性进行映射,则有必要为这些属性添加转换机制。因为Value是字符串类型,所以它的格式复杂性是有限的。虽然转换机制可以包括某种按格式解析字符串的功能,以便转换为复杂的目标对象,但这将使最终的XAML用户头疼。

其实我一直很好奇在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属性值和特性值(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js 默认选中select 选项FFT(快速傅里叶变换)摘要下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

走进WPF之UI布局

一个成功的软件,离不开人性化的UI设计,如何抓住用户第一视觉,让用户产生依赖感,合适优雅的布局必不可少。本文以一些简单的小例子,简述WPF中布局面板控件的使用,仅供学习分享使用,如有不足之处,还请指正。 涉及知识点 在WPF中,关于布局面板控件,主要有以下几种: StackPanel:栈面板,可以将元素排列成一行或者一列。其特点是:每个元素各占一行或者一...

WPF: 在ListView中添加Checkbox列表

描述:ListView是WPF中动态绑定工具的数据容器,本文实现了一个在ListView中显示的供用户选择的列表项目,并且控制列表中选择的项目数量,即实现单选。 XAML中创建ListView,代码如下: <ListView x:Name="listView_LineOfBusiness" Width="280" Height="220">...

WPF入门-使用C#创建简单应用

本文,你将熟悉在使用VS2019开发应用程序时可使用的许多工具、对话框和设计器。将创建一个“Hello World”应用程序、UI设计器、添加代码并调试错误。 先决条件: 安装Visual Studio 2019(16.3或者更高版本)。本文环境是16.8 一、创建项目   1、打开VS2019,   2、在‘开始’窗口,选择‘创建新项目’:      3...

WPF 和 UWP 中,不用设置 From 或 To,Storyboard 即拥有更灵活的动画控制

无论是 WPF 还是 UWP 开发,如果用 Storyboard 和 Animation 做动画,我们多数时候都会设置 From 和 To 属性,用于从起始值动画到目标值。然而动画并不总是可以静态地指定这些值,因为更多的时候动画的起始值和目标值取决于当前 UI 的状态。 本文中,我将将尽量避免设置 From 和 To 值,让动画可以随时中断并重新开始,而中...

WPF程序性能优化总结

原文链接:https://blog.csdn.net/u010265681/article/details/77571947 WPF程序性能由很多因素造成,以下是简单地总结: 元素: 1、 减少需要显示的元素数量:去除不需要或者冗余的XAML元素代码. 通过移出不必要的元素,合并layout panels,简化templates来减少可视化树的层次。这可以...

微软WPF技术应用与实践系列(窗体与导航+容器+模型+数据绑定配多个应用案例)

课程学习地址:http://www.ibeifeng.com/goods.php?id=160 自从微软推出第一个版本的.NET Framework,已经过去差不多8年了。3.0 是第一个随操作系统发布的框架,它附带在每个Windows Vista中,也可以支持Windows XP SP2 和 Windows Server 2003。由于.NET 2.0和...