Я разработал индикатор уровня заряда батареи, состоящий из границы внутри другой границы. Ширина внутренней границы Мульти-Bound к внешней границе ActualWidth
и само значение батареи (от DataContext
, в пределах от 0,0 до 1,0):Установить элемент Фон на основе значения, возвращаемого MultiValueConverter - Как это сделать?
<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 оценивает доступные цвета и возвращает выбранный цвет сам?
Есть ли причина, по которой вы абсолютно хотите использовать MultiValueConverter? Потому что вы можете сделать это с помощью триггеров непосредственно в xaml. – mgarant
@mgarant Нет, нет абсолютной причины, вот что я подумал, что должен делать, но я думаю, что вы правы, хотя я не уверен, что знаю, с чего начать ... Если вы хотите отправить ответ, я могу согласиться это, конечно :) В частности, я не знаю, как триггер обнаружил бы, если значение находится между заданным диапазоном. – heltonbiker
Я напишу вам пример :) – mgarant