WpfConverters
介绍
这是一个用于WPF开发的值转换库,其中包含Bool、Number、String、Object等多种类型的值转换器
基本使用
添加引用
dotnet add package IceSky.WpfConverters添加命名空间
xmlns:conv="clr-namespace:IceSky.WpfConverters.Converters;assembly=IceSky.WpfConverters"常用转换器已经定义在资源文件中了,可以在Resources中用如下方式进行引用
<ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/IceSky.WpfConverters;component/Converters. xaml"/> </ResourceDictionary.MergedDictionaries>
数值转换器
- NegatvieNumberConverter:负数转换器,对数值参数执行取负操作
<TextBlock Text="{Binding Text, Converter={StaticResource NegatvieNumberConverter}}"/> - RoundConverter:舍入转换器,对数值参数执行舍入操作,可以指定舍入模式和小数位数
<TextBlock Text="{Binding Text, Converter={StaticResource Round2DecimalsConverter}}"/> - NumberToBoolConverter:数值转bool转换器,0为false,非0为true
<TextBlock Text="{Binding Text, Converter={StaticResource NumberToBoolConverter}}"/> - NumberToRatioIntConverter:数值比例转换器,将数值参数乘以比例系数并取整,可以指定比例系数
<TextBlock Text="{Binding Text, Converter={StaticResource NumberToDoubleIntConverter}}"/> - RangeMapConverter:范围映射转换器,将数值从一个范围映射到另一个范围,可以指定源范围和目标范围
<Border Width="{Binding Value Converter={conv:RangeMapConverter FromMin=0,FromMax=100,ToMin=100,ToMax=300}}"> - PercentConverter:百分比转换器,将数值从指定范围映射到0~100,可以指定范围最小值和最大值
<TextBlock Text="{Binding Text, Converter={conv:PercentConverter Maximum=1000},StringFormat={}{0} %}"/> - InRangeConverter:范围判断转换器,判断值是否在 [Min, Max] 区间内,可以指定是否包含起始或结束值
<TextBlock Text="{Binding Text, Converter={conv:InRangeConverter Min=-100,Max=100}}"/> <!--Reversed--> <TextBlock Text="{Binding Text, Converter={conv:InRangeConverter Min=-100,Max=100,IsReversed=True}}"/> <!--Exclude Min--> <TextBlock Text="{Binding Text, Converter={conv:InRangeConverter Min=-100,Max=100,IncludeMin=False}}"/> - FileSizeConverter:文件大小转换器,将整数转换为文件的字节大小
<TextBlock Text="{Binding Text, Converter={StaticResource FileSizeConverter}}"/> - IntToStringConverter:整数转字符串转换器,将字符串按指定分隔符分割后,返回整数指定索引的字符串,可以指定分隔符、是否删除空白、默认值
<TextBlock Text="{Binding Value,Converter={conv:IntToStringConverter Source='Unknow,Active,Inactive',Default=Out of range}}" /> - InterpolateNumberConverter:数值插值转换器,指定起始值、结束值、步进值、数量中的三个来自动生成中间值列表,设置ClampToBounds=True可以将值限制在指定范围内
<!--Result is 0,25,50,75,100--> <ListBox ItemsSource="{Binding Converter={conv:InterpolateNumberConverter Start=0, End=100, Count=5}}"/> <!--Result is 10,15,20,25,30--> <ListBox ItemsSource="{Binding Converter={conv:InterpolateNumberConverter Start=10, Step=5, Count=5}}"/> <!--Result is 0,-2.8,-5.6,-8.4,-10--> <ListBox ItemsSource="{Binding Converter={conv:InterpolateNumberConverter Start=0, End=-10, Step=-2.8, ClampToBounds=True"/>
布尔转换器
- InvertBoolConverter:bool取反转换器,将bool参数取反
<TextBlock Text="{Binding IsChecked,Converter={conv:InvertBoolConverter}}"/> - IsNullOrEmptyConverter:空值判断转换器,判断参数是否为空,默认为空时返回true,可以设置IsInverted=True反转判断
<CheckBox IsChecked="{Binding Text,Converter={StaticResource IsNullOrEmptyConverter}}"/> <!--Inverted--> <CheckBox IsChecked="{Binding Text,Converter={StaticResource InvertedNullOrEmptyConverter}}"/> - BoolToVisibleConverter:bool转可见性转换器,默认true=Visible,false=Collapsed,可以使用UseHidden=True来设置false=Hidden,设置IsInverted=True反转判断
<Border Visibility="{Binding IsChecked, Converter={StaticResource BoolToVisibleConverter}}"/> <!--Inverted--> <Border Visibility="{Binding IsChecked, Converter={StaticResource InvertBoolToVisibleConverter}}"/> <!--False to Hidden--> <Border Visibility="{Binding IsChecked, Converter={StaticResource FalseToHiddenConverter}}"/> - BoolToObjectConverter:bool转对象转换器,将bool参数转为任意对象,可以分别设置true和false所对应的值
<TextBlock Text="{Binding IsChecked,Converter={conv:BoolToObjectConverter TrueValue=Man, FalseValue=Woman}}"/> <!--With null value--> <TextBlock Text="{Binding IsChecked,Converter={conv:BoolToObjectConverter TrueValue=运行, FalseValue=停止, NullValue=未知}}"/> <!--BoolToColor, True is Green, False is Red--> <Border Background="{Binding IsChecked Converter={StaticResource BoolToColorConverter}}"/> - CompareToConverter:比较转换器,将参数和目标值按指定运算符进行比较,返回比较结果,可以设置IsInverted=True反转判断,比较方式包括:Equal, NotEqual, Greater, Less, GreaterOrEqual, LessOrEqual, In, NotIn, StartsWith, EndsWith, Contains
<!-- >10 is true--> <TextBlock Text="{Binding Text,Converter={conv:CompareToConverter TargetValue=10,Operator=Greater}}"/> <!--Inverted, >10 is false--> <TextBlock Text="{Binding Text,Converter={conv:CompareToConverter TargetValue=10,Operator=Greater,IsInverted=True}}"/> <!-- StartsWith 'a' is true--> <TextBlock Text="{Binding Text,Converter={conv:CompareToConverter TargetValue=a,Operator=StartsWith}}"/> <!--Contains 'a' or 'A' is true--> <TextBlock Text="{Binding Text,Converter={conv:CompareToConverter TargetValue=a,Operator=Contains,IgnoreCase=True}}"/> <!--'12' or 'ab' or 'at' is true--> <TextBlock Text="{Binding Text,Converter={conv:CompareToConverter TargetValue='12, ab, at',Operator=In}}"/> - MultiLogicConverter:多值逻辑转换器,默认对多个值进行And判断,可以设置UseOr=True进行Or判断
<Button> <Button.IsEnabled> <MultiBinding Converter="{conv:MultiLogicConverter}"> <Binding Path="IsChecked" ElementName="Chk1"/> <Binding Path="IsChecked" ElementName="Chk2"/> <Binding Path="IsChecked" ElementName="Chk3"/> </MultiBinding> </Button.IsEnabled> </Button> <!--Use or--> <MultiBinding Converter="{conv:MultiLogicConverter UseOr=True}"> ... </MultiBinding>
字符串转换器
- DateFormatConverter:日期格式转换器,可以按指定格式转换DateTime、DateTimeOffset、TimeSpan为字符串
<TextBlock Text="{Binding Date, Converter={StaticResource StandardDateTimeConverter}}"/> <!--Universal format--> <TextBlock Text="{Binding Date, Converter={StaticResource StringFormatConverter Format={}{0:u}}}"/> <!--Chinese format--> <TextBlock Text="{Binding Date, Converter={StaticResource StringFormatConverter Format={}{0:yyyy年MM月dd日}}}"/> - StringFormatConverter:字符串格式转换器,可以按指定格式转换字符串
<!--Right align--> <TextBlock Text="{Binding Text, Converter={conv:StringFormatConverter Format='|{0,10}|'}}"/> - StringCaseConverter:字符串大小写转换器,默认转为小写,可以设置ToUpper=True来转为大写
<!--UpperCase--> <TextBlock Text="{Binding Text, Converter={StaticResource UpperCaseConverter}}"/> - TextTruncateConverter:字符串截断转换器,将字符串按指定长度进行截断
<TextBlock Text="{Binding Text, Converter={StaticResource Max20LengthConverter}}"/> - MaskFormatterConverter:字符串掩码转换器,对字符串指定位置进行掩码
<TextBlock Text="{Binding Text, Converter={StaticResource StringMaskConverter}}"/> - StringToListConverter:字符串转列表转换器,将字符串按指定分隔符转为列表
<ComboBox ItemsSource="{Binding Text, Converter={conv:StringToListConverter}}"/> - StringToDictionaryConverter:字符串转字典转换器,将字符串按指定分隔符转为字典
<ComboBox ItemsSource="{Binding Text, Converter={conv:StringToDictionaryConverter}}" DisplayMemberPath="Key" SelectedValuePath="Value"/> - MultiStringConcatConverter:多个字符串连接转换器,将多个参数使用指定分隔符进行连接
<TextBlock> <TextBlock.Text> <MultiBinding Converter="{conv:MultiStringConcatConverter Separator=', '}"> <Binding ElementName="txtStr1" Path="Text"/> <Binding ElementName="txtMaskStr" Path="Text"/> </MultiBinding> </TextBlock.Text> </TextBlock>
对象转换器
- NullOrEmptyToObjectConverter:空转对象转换器,将空值转为指定对象,可以设置IsInverted=True反转判断
<TextBlock Text="{Binding Text,Converter={conv:NullOrEmptyToObjectConverter EmptyValue=is empty}}" Foreground="{Binding Text,Converter={conv:NullOrEmptyToObjectConverter EmptyValue=Red, NonEmptyValue=Green}}" FontWeight="{Binding Text,Converter={conv:NullOrEmptyToObjectConverter EmptyValue=Bold,NonEmptyValue=Normal}}"/> - NullOrEmptyToInvisibleConverter:空转不可见转换器,默认将空值转为Collapsed,可以使用UseHidden=True来设置空值=Hidden,设置IsInverted=True反转判断
<Button Visibility="{Binding Text, Converter={StaticResource NullOrEmptyToHiddenConverter}}"/> - InvertVisibilityConverter:Visibility反转转换器,默认将Visible转为Collapsed,可以使用UseHidden=True来设置转为Hidden
<Border Visibility="{Binding Visibility,Converter={StaticResource InvertVisibilityConverter}}"/> - EqualsToBoolConverter:相等转bool转换器,使用Equals和目标值比较,若相等则为true,可以设置IsInverted=True反转判断
<!--Text=0 is true--> <TextBlock Text="{Binding Text,Converter={StaticResource IsZeroConverter}}"/> <!--SelectedIndex!=2 is true--> <TextBlock Text="{Binding SelectedIndex,Converter={conv:EqualsToBoolConverter TargetValue={t:Int 2},IsInverted=True}}"/> - SwitchConverter:分支转换器,可以设置字典类型的分支条件进行匹配,支持忽略大小写
<!-- SwitchConverter use Cases from another converter --> <TextBlock Text="{Binding Text,Converter={conv:SwitchConverter Cases={conv:ConverterProperty FromConverter={conv:StringToDictionaryConverter Source='a=1,b=2,c=3'}},IgnoreCase=True,DefaultValue=0}}"/> - WhenThenConverter:条件转换器,可以在Xaml文件中定义条件,根据条件返回结果
<!--Resource--> <conv:WhenThenConverter x:Key="StatusSwitchConverter" DefaultValue="未知状态"> <conv:WhenThenConverter.Cases> <conv:SwitchCase When="Active" Then="激活"/> <conv:SwitchCase When="Inactive" Then="未激活"/> </conv:WhenThenConverter.Cases> </conv:WhenThenConverter> <TextBlock Text="{Binding Text,Converter={StaticResource StatusSwitchConverter}}"/> - StringMappingConverter:字符串映射转换器,按字符串进行分隔映射,转换结果为字符串
<TextBlock Text="{Binding Text,Converter={conv:StringMappingConverter MappingString='1=⏳,2=✅,3=🚚,4=📦,5=❌', DefaultValue=-}}"/> - IndexToObjectConverter:索引转对象转换器,转换对象列表中的指定索引
<!--Define list in resource--> <x:Array Type="sys:String" x:Key="StringSource"> <sys:String>first</sys:String> <sys:String>second</sys:String> <sys:String>third</sys:String> </x:Array> <TextBlock Text="{Binding SelectedIndex,Converter={conv:IndexToObjectConverter OptionList={StaticResource StringSource},DefaultValue=-}}"/> - TypeCastConverter:类型转换器,将参数转为目标类型,可以指定转换失败的默认值
<conv:TypeCastConverter x:Key="tc" TargetType="sys:Int16" DefaultValue="{t:Int 2}"/> - EnumToListConverter:枚举转列表转换器,默认使用枚举名称作为列表值,可以使用UseDescription=True指定使用描述作为列表值,使用ExcludeValue指定要排除的枚举值,多个可以用','分隔
<ComboBox ItemsSource="{Binding Source={x:Type local:TestEnum}, Converter={conv:EnumToListConverter UseDescription=True, ExcludeValue='0,2'}}"/> - EnumToDictionaryConverter:枚举转字典转换器,字典的Key为枚举的值,默认使用枚举名称作为字典的Value,可以使用UseDescription=True指定使用描述作为字典的Value,使用ExcludeValue指定要排除的枚举值,多个可以用','分隔
<ComboBox ItemsSource="{Binding Source={x:Type local:TestEnum}, Converter={conv:EnumToDictionaryConverter UseDescription=True}}" DisplayMemberPath="Value" SelectedValuePath="Key"/>
颜色转换器
- ColorAutoConverter:颜色转换器,支持String、Color和Brush三者的互相转换
<Border Background="{Binding Text, Converter={StaticResource ColorAutoConverter}}"/> - ColorToTupleConverter:颜色转Tuple转换器,支持RGB和HSL两种方式,默认为RGB模式,可以设置ToHsl=True指定为HSL模式
<TextBlock Text="{Binding Text,Converter={StaticResource Color2RgbConverter}}"/> - ValueToRangeColorConverter:值转范围颜色转换器,可以将数值按比例转为指定颜色范围中间的颜色,可以设置ToHsl=True指定为HSL模式,默认值为:0~100对应红色到绿色
<Border Background="{Binding Value, Converter={StaticResource DefaultValueToRangeRgbConverter}}"/> - BrightnessConverter:颜色亮度转换器,将颜色按指定系数调整亮度,默认系数为0.5
<Border Background="{Binding Text, Converter={conv:BrightnessConverter Factor=0.2}}"/> - InterpolateColorConverter:颜色插值转换器,指定起始、结束颜色和数量自动生成中间颜色列表,默认为RGB模式,可以设置UseHsl=True指定为HSL模式
<!--RGB mode--> <ItemsControl ItemsSource="{Binding Converter={conv:InterpolateColorConverter StartValue=Red,EndValue=Green,Count=10}}"/> <!--HSL mode--> <ItemsControl ItemsSource="{Binding Converter={conv:InterpolateColorConverter StartValue=Blue,EndValue=Orange,Count=10,UseHsl=True}}"> - ValuesToColorConverter:将三个或四个数值转为颜色,第四个数值表示不透明度,默认为RGB模式,可以设置ToHsl=True指定为HSL模式
<TextBlock> <TextBlock.Text> <MultiBinding Converter="{conv:ValuesToColorConverter IsHsl=True}"> <Binding ElementName="sldH" Path="Value"/> <Binding ElementName="sldS" Path="Value"/> <Binding ElementName="sldL" Path="Value"/> <Binding ElementName="sldA" Path="Value"/> </MultiBinding> </TextBlock.Text> </TextBlock>
表达式转换器
ExpressionConverter,使用‘#’作为变量占位符,可以将字符串参数放在单引号中,支持的运算包括:
- 四则运算:支持+、-、×、÷、%(取模)运算
<TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='#+2'}}"/> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='#/4'}}"/> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='#%5'}}"> - 逻辑运算:支持And、Or、Not运算
<TextBlock Text="{Binding IsChecked,Converter={conv:ExpressionConverter Formula=# and true}}"/> <TextBlock Text="{Binding IsChecked,Converter={conv:ExpressionConverter Formula=# or false}}"/> <TextBlock Text="{Binding IsChecked,Converter={conv:ExpressionConverter Formula=not #}}"> <TextBlock Text="{Binding IsChecked,Converter={conv:ExpressionConverter Formula='iif(#,\'yes\',\'no\')'}}"> - 比较运算:支持>、<、>=、<=、<>、=,>和<在xaml中需要用>和<进行转义
<!-- >2 --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula=#>2}}"/> <!-- <=3 --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='# <=3'}}"/> <!-- <>5 --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula=# <>5}}"/> <!-- >=60 && <=100 --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='# >= 60 AND # <= 100'}}"/> - 字符串运算:支持Len(expression)、Trim(expression)、Substring(expression, start, length)、和IIF(expression, truevalue, falsevalue)等方法
<!-- Len --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='len(\'#\')'}}"/> <!-- Trim --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='trim(\'#\')'}}"/> <!-- Concat --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='#+\'abc\''}}"/> <!-- Substring --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='substring(\'#\',2,3)'}}"/> <!-- IIF --> <TextBlock Text="{Binding Text,Converter={conv:ExpressionConverter Formula='iif(#>5,\'是\', \'否\')'}}"/>
方法转换器
MethodConverter,可以使用实例方法、静态方法或扩展方法进行转换,可以用ParameterStr来指定方法参数,多个参数用','分隔,设置IgnoreCase=True可以指定方法名不区分大小写
<!-- ToUpper -->
<TextBlock Text="{Binding Text, Converter={conv:MethodConverter MethodName=ToUpper}}"/>
<!-- Replace -->
<TextBlock Text="{Binding Text, Converter={conv:MethodConverter MethodName=Replace,ParameterStr='a,b'}}"/>
<!-- Static method: Math.Abs -->
<TextBlock Text="{Binding Text, Converter={conv:MethodConverter TargetType={x:Type sys:Math}, MethodName=abs, IgnoreCase=True}}"/>
<!-- Custom string extension method: ExtractDigits -->
<TextBlock Text="{Binding Text, Converter={conv:MethodConverter TargetType={x:Type ext:StringExtensions},MethodName=ExtractDigits}}"/>
链式转换器
库中所有的转换器都支持链式转换,包含FromConverter参数可以指定使用其他转换器作为输入
<!-- Triple rounding and to currency -->
<TextBlock Text="{Binding Text, Converter={conv:StringFormatConverter Format={}{0:C}, FromConverter={conv:NumberToRatioIntConverter Ratio=3}}}"/>
<!-- SwitchConverter use Cases from another converter -->
<TextBlock Text="{Binding Text,Converter={conv:SwitchConverter Cases={conv:ConverterProperty FromConverter={conv:StringToDictionaryConverter Source='1=⏳,2=✅,3=🚚,4=📦,5=❌'}}}}"/>
<!-- Calculate the sin value after convert the angle to radians -->
<TextBlock Text="{Binding Value, Converter={conv:MethodConverter TargetType={x:Type sys:Math},MethodName=Sin, FromConverter={conv:MethodConverter TargetType={x:Type ext:NumberExtensions},MethodName=ToRadians}}}"/>
类型化参数标记扩展
此库中包含了基本数据类型的类型化参数标记扩展,可以作为在XAML中写入原始类型值的简写,其中包括了基本的数值类型、Char、String、Bool、Date、Time、DateTime、TimeSpan、DateTimeOffset、Guid、Enum、EnumValues、Point、Size、Rect、Vector、Color、HSLColor、Brush、StringList、IntList、DoubleList,使用时需要添加命名空间:
xmlns:t="clr-namespace:IceSky.WpfConverters;assembly=IceSky.WpfConverters"
- 使用示例
<Slider Value="{t:Double 5}"/> <TextBlock Text="{Binding Source={t:Enum local:TestEnum,Option1}}"/> <ComboBox ItemsSource="{t:EnumValues local:TestEnum}"/> <ComboBox ItemsSource="{t:IntList '1,2,3'}"/> <TextBlock Text="{Binding Source={t:Point 10,20}}"/> <TextBlock Text="{Binding Source={t:Size 100,200}}"/> <TextBlock Text="{Binding Source={t:Rect 0,0,100,100}}"/> <TextBlock Text="{Binding Source={t:Vector 5,10}}"/> <Ellipse Fill="{t:Brush red}"/> <Ellipse Fill="{t:Brush {t:Color 200,100,100,0.5}}"/> <Ellipse Fill="{t:Brush {t:HSLColor 180,1,0.5,0.5}}"/>