我设计了一个电池电量指示器,由另一个边框内的边框组成。内边框的宽度与外边框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 评估可用颜色并返回所选颜色本身?