博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF进阶之接口(1):IValueConverter,IMultiValueConverter
阅读量:5905 次
发布时间:2019-06-19

本文共 2890 字,大约阅读时间需要 9 分钟。

看一个例子,FontFamily="Trebuchet MS, GlobalSansSerif.CompositeFont" 。这样一条简单的语句,熟悉WPF的人在xaml中可能经常使用。问题是为什么,WPF能将一个string类型的值,赋值给FontFamily类型。答案:WPF团队在实现XAML语言的时候,为了使用户能像使用HTML语法一样方便,在WPF中集成了很多的转换器,它们能将String值转化为各种类型,赋值给Control的各个属性。进一步讨论,本人使用C#4年,WPF3年。个人一点点浅见,MS的WPF的确为用户考虑了很多,原来很多复杂的功能,现在仅仅几条语句就能实现,MS力求用强大的FrameWork,降低对程序员能力的要求(改变过去C++的思路),进而用户在初步接触WPF时有种随心所欲的感觉。但是要记住:凡是越方便的,出了问题后,结果越难查找。例如之前说过的WebBrowser内容不可见的问题(请参看WPF WebBrowser 不可见问题的解析)。原因在于你不知道MS的很多内部实现原理,当用户习惯方便的使用WPF各种强大功能时,便慢慢养成对一个问题不求甚解的习惯。那么在编程时往往不能实现真正的随心所欲。进入正题,不就是一个值转换吗,值得展开吗。我认为是值得的。且看一下代码(摘自MSDN):namespace Converter{[ValueConversion(typeof(DateTime), typeof(String))]public class DateConverter : IValueConverter{    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)    {        DateTime date = (DateTime)value;        return date.ToShortDateString();    }    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)    {        string strValue = value as string;        DateTime resultDateTime;        if (DateTime.TryParse(strValue, out resultDateTime))        {            return resultDateTime;        }        return DependencyProperty.UnsetValue;    }}}Xaml:xmlns:src="clr-namespace:Converter"
...................
Start Date:
分析:在xaml中设置TextBlock Text="{Binding Path=StartDate, Converter={StaticResource dateConverter}}" 其中StartData是后台中的一个属性,类型为任意,当为String是可以直接绑定,当为其他值是就需要Converter来实现转换。这也就是实现IValueConverter的意义。实现IValueConverter接口主要是 实现public object Convert(object value, Type targetType, object parameter, CultureInfo culture)public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)其中:Convert实现后台值向UI显示的值 之间的转换ConvertBack实现UI显示值向后台值 之间的转换。 再来看看IMultiValueConverter,它和IValueConverter类似,不同在于,IMultiValueConverter可实现有几个后台值综合决定前台UI显示的值。public class DragDropListBox_ViewportSizeConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { double u = 0.12; double ThumbHeight = 94; if (double.Parse(values[2].ToString()) != double.NaN) { u = ThumbHeight / double.Parse(values[2].ToString()); } double size = 0; double Max = double.Parse(values[0].ToString()); double Min = double.Parse(values[1].ToString()); size = (Max - Min) * u / (1 - u); return size; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { return null; } }此例实现Scrollbar外观的定义,size的值由object[] values数组中的值综合决定。这里不做展开,在后续控件重写中将详细介绍。好了,说那么多,希望大家能了解一点,WPF虽功能强大,但是程序员仍然要了解WPF的实现机制,顺着它的实现原理,那么WPF能让你随心所欲。如果不求甚解。常常会一头雾水。。在WPF进阶之接口系列中我们将介绍重要的WPF接口,,在其中将穿插讲解部分WPF内部原理下一节中我们将向大家介绍IDispose,ICollectionView接口

 转自

转载地址:http://ohdpx.baihongyu.com/

你可能感兴趣的文章
html中base标签的用处
查看>>
LNMP的技术讲解
查看>>
前端基础入门一(HTML)
查看>>
再不努力,就真的没有机会了
查看>>
SVN Hooks的介绍及使用
查看>>
路由器设置密码和标语
查看>>
CSS3属性
查看>>
Oracle 字符集的查看和修改【上】
查看>>
JQuery 基础操作
查看>>
linux 脚本之 expect命令使用
查看>>
沃通SSL证书支持ECC算法吗?
查看>>
javassist用法总结
查看>>
好程序员web前端分享CSS3弹性盒
查看>>
游戏UI框架设计(二) : 最简版本设计
查看>>
(转)Python中第三方模块的使用心得
查看>>
tomcat注册windows服务
查看>>
使用qq邮箱的smpt服务发送邮件一定要记得用ssl
查看>>
20个非常有用的Java代码片段
查看>>
转 ubuntu解压命令全览
查看>>
Android开发的前景分析——之你为何看好Android?
查看>>