当前位置:   article > 正文

WPF真入门教程25--Converter转换器_wpf converter

wpf converter

WPF的Binding机制给程序的开发带来极大方便,但有时源数据和绑定对象之间需要进行一定的逻辑转换,直接的简单绑定不能满足使用要求,WPF当然考虑了这一点,在Binding中我们可以添加自定义的转换逻辑,即转换器Converter。WPF中的转换器是一个非常好的数据类型转换解决方案,实用和强大, 它的作用是将源数据转换为WPF自身需要的类型,对数据实体没有侵略性,会在项目工程中频繁使用。所以掌握转换器是WPF开发的必备技能。

比如DateTime类型的时间转换为yyyyMMdd的日期,还比如要将0,1转换成男,女,这种情况下,就需要定制自己的Converter

.Net Framework提供了两种Converter接口,单值转换的接口IValueConverter和多值转换的接口IMultiValueConverter,它们都属于System.Windows.Data命名空间,在程序集PresentationFramework.dll中。这两种值转换器都是分区域性的。其中方法Convert和ConvertBack都具有指示区域性信息的culture参数。如果区域性信息与转换无关,那么在自定义转换器中可以忽略该参数。下面来看下具体操作

一、单值转换器IValueConverter

1、在项目中control文件夹创建一个窗口文件ConverterWin.xaml,并在启动文件app.xaml修改启动文件为ConverterWin.xaml

2、在项目的common文件夹中添加一个类TimeConverter,意为时间转换器类,代码是:

 3、在ConverterWin.xaml文件里添加控件,并导入命名空间,设置资源,具体代码是:

  1. <Window x:Class="WpfApp6.control.ConverterWin"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:WpfApp6.control"
  7. xmlns:utils="clr-namespace:WpfApp6.common"
  8. mc:Ignorable="d"
  9. Title="ConverterWin" Height="450" Width="800">
  10. <!--定义窗口资源,utils是定义的命名空间别名,TimeConverter是common文件夹中的类TimeConverter,key是取个键名-->
  11. <Window.Resources>
  12. <utils:TimeConverter x:Key="cvtDate"/>
  13. </Window.Resources>
  14. <Grid>
  15. <DatePicker x:Name="dateOne" HorizontalAlignment="Left" Margin="85,50,0,0" VerticalAlignment="Top" Width="183" SelectedDateFormat="Long"/>
  16. <!--textbox控件的text属性绑定了日期控件,并使用前面定义的转换器cvtDate-->
  17. <TextBox x:Name="textBox" Text="{Binding ElementName=dateOne,Path=SelectedDate,Converter={StaticResource cvtDate}}" HorizontalAlignment="Left"
  18. Height="23" Margin="85,105,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="183"/>
  19. <Label x:Name="label" Content="选择结果:" HorizontalAlignment="Left" Margin="19,105,0,0" VerticalAlignment="Top"/>
  20. <Label x:Name="label1" Content="{Binding ElementName=dateOne,Path=Text}" HorizontalAlignment="Left" Margin="85,145,0,0" VerticalAlignment="Top"/>
  21. </Grid>
  22. </Window>

4、运行程序,效果是:

这个就是单值转换器,看到效果可以理解吧!

 二、多值转换器IMultiValueConverter

多值转换器IMultiValueConverter意思是指可以转换多值的数据源,它需要继承IMultiValueConverter接口,接口使用和IValueConverter逻辑相同。我们要操作的例子是:当纵向流量大于横向流量时指示灯应为绿色,当纵向流量小于横向流量时指示灯应为红色,否则指示灯为黄色。

1、在common文件夹中添加类ColorConverter,代码是:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows;
  8. using System.Windows.Data;
  9. using System.Windows.Media;
  10. namespace WpfApp6.common
  11. {
  12. public class ColorConverter : IMultiValueConverter
  13. {
  14. //当值从绑定源传播给绑定目标时,values是一个数组
  15. public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  16. {
  17. if (values == null || values.Length <0 )
  18. {
  19. return DependencyProperty.UnsetValue;//返回没有设置属性值
  20. }
  21. double verValue = (double)values[0];//获取数组中的第一个参数,即sliderVer控件的值
  22. double horValue = (double)values[1];//获取sliderHor控件的值
  23. if (verValue > horValue)
  24. {
  25. return new SolidColorBrush(Colors.Green);
  26. }
  27. else if (verValue < horValue)
  28. {
  29. return new SolidColorBrush(Colors.Red);
  30. }
  31. return new SolidColorBrush(Colors.Yellow);
  32. }
  33. //反向修改
  34. public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  35. {
  36. //返回空,标记不可双向转换
  37. return null;
  38. }
  39. }
  40. }

2、在ConverterWin.xaml文件中添加标签控件2个,滑动控件2个,圆控件1个,完整代码是:

  1. <Window x:Class="WpfApp6.control.ConverterWin"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:WpfApp6.control"
  7. xmlns:utils="clr-namespace:WpfApp6.common"
  8. mc:Ignorable="d"
  9. Title="ConverterWin" Height="450" Width="800">
  10. <!--定义窗口资源,utils是定义的命名空间别名,TimeConverter是common文件夹中的类TimeConverter,key是取个键名,ColorConverter同理-->
  11. <Window.Resources>
  12. <utils:TimeConverter x:Key="cvtDate"/>
  13. <utils:ColorConverter x:Key="cvtColor"/>
  14. </Window.Resources>
  15. <Grid>
  16. <DatePicker x:Name="dateOne" HorizontalAlignment="Left" Margin="85,50,0,0" VerticalAlignment="Top" Width="183" SelectedDateFormat="Long"/>
  17. <!--textbox控件的text属性绑定了日期控件,并使用前面定义的转换器cvtDate-->
  18. <TextBox x:Name="textBox" Text="{Binding ElementName=dateOne,Path=SelectedDate,Converter={StaticResource cvtDate}}" HorizontalAlignment="Left"
  19. Height="23" Margin="85,105,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="183"/>
  20. <Label x:Name="label" Content="选择结果:" HorizontalAlignment="Left" Margin="19,105,0,0" VerticalAlignment="Top"/>
  21. <Label x:Name="label1" Content="{Binding ElementName=dateOne,Path=Text}" HorizontalAlignment="Left" Margin="85,145,0,0" VerticalAlignment="Top"/>
  22. <!--多值转换器-->
  23. <Label Content="纵向值" HorizontalAlignment="Left" Margin="363,50,0,0" VerticalAlignment="Top"/>
  24. <Slider x:Name="sliderVer" HorizontalAlignment="Left" Margin="473,50,0,0" VerticalAlignment="Top" Height="25" Width="278"/>
  25. <Label Content="横向值" HorizontalAlignment="Left" Margin="363,105,0,0" VerticalAlignment="Top"/>
  26. <Slider x:Name="sliderHor" HorizontalAlignment="Left" Margin="473,105,0,0" VerticalAlignment="Top" Height="25" Width="278"/>
  27. <Ellipse HorizontalAlignment="Left" Height="100" Margin="554,145,0,0" Stroke="Black" VerticalAlignment="Top" Width="100">
  28. <Ellipse.Fill>
  29. <MultiBinding Converter="{StaticResource cvtColor}">
  30. <!--第一个绑定关联sliderVer控件的value-->
  31. <Binding ElementName="sliderVer" Path="Value"/>
  32. <!--第二个绑定关联sliderHor控件的value-->
  33. <Binding ElementName="sliderHor" Path="Value"/>
  34. </MultiBinding>
  35. </Ellipse.Fill>
  36. </Ellipse>
  37. </Grid>
  38. </Window>

3、运行程序:

 拖动纵向值,这时纵向值比横向值大,所以填充绿色,

 拖动横向值滑动条,当超过纵向值时,填充的是红色,效果是

 这就是多值转换器里的代码进行判断生效的。

 

转换器作用:可以将源数据和目标数据之间进行特定的转化

还是蛮帅的,变变声。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/537642
推荐阅读
相关标签
  

闽ICP备14008679号