在wpf中,使用转换器可以实现在不同情况下使用不同的样式
1.Lable红绿色切换
.xaml
xmlns:converter="clr-namespace:Dzhwt.Theme.Converter"
<UserControl.Resources>
<converter:PriceColorConverter x:Key="PriceColorConver"></converter:PriceColorConverter>
</UserControl.Resources>
<Label Content="{Binding NowPrice}" HorizontalAlignment="Right">
<Label.Foreground>
<MultiBinding Converter="{StaticResource PriceColorConver}">
<Binding Path="NowPrice"/>
<Binding Path="ClosingPrice"/>
</MultiBinding>
</Label.Foreground>
</Label>
转换器类
public class PriceColorConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
try
{
if (values[0].ToString() == "--" || values[1].ToString() == "--")
{
return new SolidColorBrush((Color)ColorConverter.ConvertFromString("#626B74"));
}
double current = System.Convert.ToDouble(values[0].ToString());
double LAST_CLOSE = System.Convert.ToDouble(values[1].ToString());
if (current < LAST_CLOSE)
{
return new SolidColorBrush((Color)ColorConverter.ConvertFromString("#008A00"));
}
else if (current > LAST_CLOSE)
{
return new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F03E3A"));
}
else if(current == LAST_CLOSE)
{
return new SolidColorBrush((Color)ColorConverter.ConvertFromString("#778899"));
}
return new SolidColorBrush((Color)ColorConverter.ConvertFromString("#626B74"));
}
catch (Exception e)
{
return new SolidColorBrush((Color)ColorConverter.ConvertFromString("#626B74"));
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return null;
}
}
通过给Lable绑定转换器PriceColorConverter,传递的参数为属性NowPrice和ClosingPrice,当NowPrice>ClosingPrice时,Label显示红色,反之显示绿色,相等则为灰色。
2.控制svg箭头的样式
.xaml
<converter:CompareConverter x:Key="CompareConverter"></converter:CompareConverter>
<Path Stretch="Uniform" Height="15" HorizontalAlignment="Left" VerticalAlignment="Center" Data="M479.744 307.2l168.96 165.888a32.768 32.768 0 0 1 0 46.592 30.72 30.72 0 0 1-45.568 0L486.4 409.6v464.896a32.768 32.768 0 1 1-65.024 0V409.6l-117.248 118.784a39.424 39.424 0 0 1-45.568-6.656 32.768 32.768 0 0 1 0-46.592L421.376 307.2a35.328 35.328 0 0 1 58.368 0z">
<Path.Style>
<Style TargetType="Path">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Value="1">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource CompareConverter}">
<Binding Path="NowPrice" />
<Binding Path="ClosingPrice" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Fill" Value="Red" />
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Value="-1">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource CompareConverter}">
<Binding Path="NowPrice" />
<Binding Path="ClosingPrice" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Fill" Value="Green" />
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
<Setter Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="180"/>
</Setter.Value>
</Setter>
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Value="0">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource CompareConverter}">
<Binding Path="NowPrice" />
<Binding Path="ClosingPrice" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
转换器类
public class CompareConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values != null && values.Length == 2)
{
double result1, result2;
if(double.TryParse(values[0].ToString(), out result1)&&double.TryParse(values[1].ToString(), out result2))
{
if (result1 == result2)
{
return 0;
}
else if (result1 > result2)
{
return 1;
}
else
{
return -1;
}
}
}
return 0;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Path控件为一个向上的箭头,通过给Path绑定转换器CompareConverter ,传递的参数为属性NowPrice和ClosingPrice,当NowPrice>ClosingPrice时,Path样式为一个向上的红色箭头,反之为一个向下的绿色箭头,相等则不显示。