2

我设计了一个电池电量指示器,由另一个边框内的边框组成。内边框的宽度与外边框ActualWidth和电池值本身多重绑定(从DataContext,范围从 0.0 到 1.0):

<Border x:Name="BatteryChargeContainer">
    <Border x:Name="BatteryCharge" Margin="1" HorizontalAlignment="Left" Background="Gray">
            <Border.Width>
                <MultiBinding Converter="{StaticResource NormalValueConverter}" FallbackValue="10">
                    <Binding Path="BatteryLevel"/>
                    <Binding Path="ActualWidth" ElementName="BatteryChargeContainer"/>
                </MultiBinding>
            </Border.Width>
        </Border>
</Border>   

===================

class NormalValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values.Any(v => v == null))
            return null;
        var v1 = values[0];
        var v2 = values[1];

        double valor = System.Convert.ToDouble(v1);
        double measure = System.Convert.ToDouble(v2);

        return valor * measure;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

现在我想Background用另一个 IMultiValueConverter 为该属性做一些类似的事情。颜色应该这样计算:

  • 如果高于 0.8,则为绿色;
  • 黄色介于 0.6 和 0.8 之间;
  • 橙色在 0.3 和 0.6 之间;
  • 如果低于 0.3,则为红色。

这些颜色被定义为资源,因为我绝对不想在代码中声明它们,所以我的问题是:

如果颜色被定义为资源,并且在 MultiBind 转换器中计算了实际应用的颜色,我如何根据返回的值应用颜色,或者让 MultiConverter 评估可用颜色并返回所选颜色本身?

4

1 回答 1

2

您可以将触发器与转换器一起使用。如果值大于给定数字,转换器将返回 true。这里有一个例子:

<Border x:Name="BatteryChargeContainer">
    <Border x:Name="BatteryCharge" Margin="1" HorizontalAlignment="Left" Background="Gray">
        <Border.Style>
            <Style TargetType="Border">
                <Setter RED.../>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding yourBinding, Converter=theConverter, ConverterParameter=0.3}" Value="true">
                        <Setter ORANGE... />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding yourBinding, Converter=theConverter, ConverterParameter=0.6}" Value="true">
                        <Setter YELLOW... />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding yourBinding, Converter=theConverter, ConverterParameter=0.8}" Value="true">
                        <Setter GREEN... />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
    </Border>

这应该有效,因为所有触发器都将按顺序进行测试。因此,例如,如果您输入值 0.9,它将在每次触发时返回 true,因此它会将颜色更改为橙​​色,然后是黄色,然后是绿色,因此您将获得绿色作为结果。

小而重要的细节,在您的转换器中,您将收到的参数将是一个字符串。在使用该值对其进行测试之前,您需要将其转换为浮点数。

希望这可以帮助!

于 2015-05-22T19:09:11.267 回答