【发布时间】:2018-04-09 06:48:24
【问题描述】:
我的 WPF 窗口上有一个 Slider 和一个 TextBlock。 TextBlock 需要通过滑块的值、范围来改变背景、前景和字体大小。
我构建了一个转换器,它接收滑块的值并为每个组返回 0、1 或 3。
public class ValueByRange : IValueConverter
{
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double.TryParse(value?.ToString(), out double dValue);
if (dValue > 80)
return 2;
else if (dValue > 50)
return 1;
return 0;
}
public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return false;
}
}
我的 TextBlock 看起来像这样:
<TextBlock Width="30" Text="{Binding ElementName= theSlider, Path=Value}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="TextAlignment" Value="Center"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=theSlider, Path=Value, Converter={StaticResource ValueByRange}}" Value="1">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontSize" Value="14"/>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=theSlider, Path=Value, Converter={StaticResource ValueByRange}}" Value="2">
<Setter Property="Background" Value="Red"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="16"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
它工作正常,但感觉不是最好的方法。转换器触发 2 次,每次触发每个 DataTrigger。我需要超过这 3 个范围,这意味着转换器将触发更多次。 出于同样的原因,为每个属性构建一个转换器也无济于事。
有没有办法只触发转换器然后检查结果(不使用其他代码)?
我知道这不是正确的语法,但我的意思是这样的:
<DataTrigger Binding="{Binding ElementName=theSlider, Path=Value, Converter={StaticResource ValueByRange}}">
<DataTrigger.Value Value ="1">
<Setter Property="Background" Value="Yellow" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="FontSize" Value="14" />
</DataTrigger.Value>
<DataTrigger.Value Value ="2">
<Setter Property="Background" Value="Red" />
<Setter Property="Foreground" Value="White" />
<Setter Property="FontSize" Value="16" />
</DataTrigger.Value>
</DataTrigger>
【问题讨论】:
-
开箱即用,您可以将转换后的值分配给 TextBlock 的 Tag 属性,并在 Tag 上有多个触发器。但是,我认为多次调用转换器根本不是问题。
-
怎么样。创建基本样式。然后三个基于三个州。使用转换器绑定样式会返回适当的样式。
标签: wpf styles converter datatrigger