WPF一个具有多个值的DataTrigger

WPF一个具有多个值的DataTrigger,wpf,styles,converter,datatrigger,Wpf,Styles,Converter,Datatrigger,我的WPF窗口上有一个滑块和一个文本块。TextBlock需要根据滑块的值、范围更改背景、前景和字体大小 我构建了一个转换器,它接收滑块的值,并为每个组返回0、1或3 public class ValueByRange : IValueConverter { public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo cultu

我的WPF窗口上有一个滑块和一个文本块。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 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>
<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>

它工作得很好,但感觉不是最好的方法。转换器触发2次,每次触发一个DataTrigger。我需要超过这3个范围,这意味着转换器将发射更多次。 出于同样的原因,为每个属性构建转换器也没有帮助

是否有办法只启动转换器一个,然后检查结果(不使用代码)

我知道这不是正确的语法,但我的意思是:

<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>
<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>

正如克莱门斯所说,多次调用转换器并没有什么错

但如果你真的想这么做,这里有一个可行的方法:

<Grid>
    <Grid.Resources>

        <local:ValueByRange x:Key="ValueByRange" />

        <Style x:Key="TextBlockInLabelStyle" 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}" Value="1">
                    <Setter Property="Background" Value="Yellow"/>
                    <Setter Property="Foreground" Value="Black"/>
                    <Setter Property="FontSize" Value="14"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding}" Value="2">
                    <Setter Property="Background" Value="Red"/>
                    <Setter Property="Foreground" Value="White"/>
                    <Setter Property="FontSize" Value="16"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

    </Grid.Resources>

    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <Slider Grid.Row="0"
            x:Name="Slider1" 
            Interval="1" 
            Minimum="0" 
            Maximum="100" />

    <Slider Grid.Row="1" 
            x:Name="Slider2" 
            Interval="1" 
            Minimum="0" 
            Maximum="100" />

    <Label Grid.Row="2" Content="{Binding ElementName=Slider1, Path=Value, Converter={StaticResource ValueByRange}}">
        <Label.Resources>
            <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockInLabelStyle}" />
        </Label.Resources>
    </Label>

    <Label Grid.Row="3" Content="{Binding ElementName=Slider2, Path=Value, Converter={StaticResource ValueByRange}}">
        <Label.Resources>
            <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockInLabelStyle}" />
        </Label.Resources>
    </Label>
</Grid>


开箱即用,您可以将转换后的值分配给TextBlock的标记属性,并在标记上有多个触发器。然而,我不认为一个转换器被多次调用是一个问题。怎么样。创建基础样式。然后在这三个州的基础上再加三个。使用转换器绑定样式将返回适当的样式。感谢Seb和Clemens。好办法!