zoukankan      html  css  js  c++  java
  • WPF进阶之接口(1):IValueConverter,IMultiValueConverter

    看一个例子,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"
    
    <src:DateConverter x:Key="dateConverter"/>
    
    ...................
    
    <TextBlock Grid.Row="2" Grid.Column="0" Margin="0,0,8,0"
               Name="startDateTitle"
               Style="{StaticResource smallTitleStyle}">Start Date:</TextBlock>
    <TextBlock Name="StartDateDTKey" Grid.Row="2" Grid.Column="1" 
        Text="{Binding Path=StartDate, Converter={StaticResource dateConverter}}" 
        Style="{StaticResource textStyleTextBlock}"/>
    
    
    分析:
    
    在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://hi.baidu.com/leo_han/item/ebd7361e436d397e7a5f250a 转自

  • 相关阅读:
    java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell
    spring boot 启动报:Composite-id class must implement Serializable: xxx错误
    IntelliJ IDEA 中使用region代码折叠
    JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String
    MySQL生成UUID
    PowerDesigner设计表时显示注释列Comment,Columns中没有Comment的解决办法
    使用PowerDesigner创建物理模型并生成SQL语句在MySQL中生成表
    IMP-00003: 遇到 ORACLE 错误 959 ORA-00959: 表空间 '' 不存在
    SP2-0734: 未知的命令开头 “IMP ”
    使用imp命令和exp命令对oracle数据库进行导入导出操作
  • 原文地址:https://www.cnblogs.com/anbylau2130/p/WPF.html
Copyright © 2011-2022 走看看