Как сопоставить диапазон цветов с целым числом?Как сопоставить диапазон цветов с целым рядом?
В частности, я хочу, чтобы ползунок шел от темно-зеленого, желтого, красного.
Следующий код добавляет оттенок только к цвету.
XAML:
<Window x:Class="MotoLens.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MotoLens"
mc:Ignorable="d"
Background="Black"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:ValueToBrushConverter x:Key="ValueToBrushConverter" />
</Window.Resources>
<Grid>
<Slider x:Name="Slider" Grid.Row="0" Minimum="0" Maximum="200" Background="{Binding RelativeSource={RelativeSource Self}, Path=Value, Converter={StaticResource ValueToBrushConverter}, ConverterParameter=0~200}"
TickFrequency="1" IsSnapToTickEnabled="True" TickPlacement="TopLeft" />
</Grid>
</Window>
ValueConverter:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var args = parameter as string;
var minimumInput = int.Parse(args?.Split('~')?[0]);
var maximumInput = int.Parse(args?.Split('~')?[1]);
var currentValue = (double)value;
var colorValue = (int)255 - (currentValue * (COLOR_RANGE_MAX/maximumInput));
var color = Color.FromArgb(COLOR_RANGE_MAX, 0, System.Convert.ToByte(colorValue), 0);
return new SolidColorBrush(color);
}
Примечание: Моя память подсказывает мне, что я должен позволить рамки сделать это для меня с помощью анимации. Не уверен, что это цветная анимация или двойная анимация.
ОБНОВЛЕНО с помощью Ответ:
namespace MotoLens
{
class ValueToBrushConverter : IValueConverter
{
static readonly Color[] _colorTable =
{
Color.FromRgb( 0, 255, 255),
Color.FromRgb( 0, 255, 0),
Color.FromRgb(255, 255, 0),
Color.FromRgb(255, 0, 0),
};
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var args = parameter as string;
var minimumInput = int.Parse(args.Split('~')[0]);
var maximumInput = int.Parse(args.Split('~')[1]);
var currentValue = ((double)value - minimumInput)/(maximumInput - minimumInput);
var col1 = (int)(currentValue * (_colorTable.Length - 1));
var col2 = Math.Min(col1 + 1, (_colorTable.Length - 1));
var t = 1.0/(_colorTable.Length - 1);
return new SolidColorBrush(Lerp(_colorTable[col1], _colorTable[col2], (currentValue - t * col1)/t));
}
public static Color Lerp(Color col1, Color col2, double t)
{
var r = col1.R * (1 - t) + col2.R * t;
var g = col1.G * (1 - t) + col2.G * t;
var b = col1.B * (1 - t) + col2.B * t;
return Color.FromRgb((byte)r, (byte)g, (byte)b);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
См. Мое обновленное сообщение. –
Итак, вопрос был удовлетворительно удовлетворен? Или существуют другие требования? Кстати, мой ответ на [этот пост] (http://stackoverflow.com/questions/32513387/how-to-create-a-color-canvas-for-color-picker-wpf) относительно выбора цвета также может представлять интерес для в этом случае вы обычно используете что-то вроде полосы оттенков в качестве фона для слайдера. –
Да. Теперь у меня есть новый вопрос: http://stackoverflow.com/questions/35760507/how-can-i-create-a-gauge-i-e-speedometer –