Я хочу создать простое приложение WPF, в котором вы устанавливаете цвет RGB (через 3 ползунка по одному на канал) и полученный цвет заполняет Rectangle
.
Конечно, это возможно, просто используя XAML, и, поскольку я хочу предоставить Rectangle.Fill
из трех различных значений, я использовал IMultiValueConverter
для привязки.
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return new SolidColorBrush(ExtractColorFrom(values));
}
private Color ExtractColorFrom(object[] values)
{
byte red = System.Convert.ToByte((double)values[0]);
byte green = System.Convert.ToByte((double)values[1]);
byte blue = System.Convert.ToByte((double)values[2]);
Color color = new Color();
color.R = red;
color.G = green;
color.B = blue;
return color;
}
Привязка делаетне работает для Rectangle.Fill
.Что-то не так с XAML?
<Window ...>
<Window.Resources>
<view_model:RgbToBrushConverter x:Key='rgb_converter'/>
</Window.Resources>
<StackPanel>
<Rectangle Width='300'
Height='190'
Stroke='Black'
StrokeThickness='1'
Margin='0 0 0 10'>
<Rectangle.Fill>
<MultiBinding Converter='{StaticResource rgb_converter}'>
<Binding ElementName='slider_red' Path='Value' Mode='OneWay'/>
<Binding ElementName='slider_green' Path='Value' Mode='OneWay'/>
<Binding ElementName='slider_blue' Path='Value' Mode='OneWay'/>
</MultiBinding>
</Rectangle.Fill>
</Rectangle>
<TextBlock HorizontalAlignment='Center'
Margin='5'
FontSize='20'>
Per channel:
<Run Text='R'
Foreground='Red' />
<Run Text='{Binding ElementName=slider_red, Path=Value}' />
<Run Text='R'
Foreground='Green' />
<Run Text='{Binding ElementName=slider_green, Path=Value}' />
<Run Text='R'
Foreground='Blue' />
<Run Text='{Binding ElementName=slider_blue, Path=Value}' />
</TextBlock>
<Slider x:Name='slider_red'
Minimum='0'
Maximum='255'
Background='Red'
Width='255'
Margin='4'
IsSnapToTickEnabled="True"
TickFrequency="1" />
<Slider x:Name='slider_green'
Minimum='0'
Maximum='255'
Background='Green'
Width='255'
Margin='4'
IsSnapToTickEnabled="True"
TickFrequency="1" />
<Slider x:Name='slider_blue'
Minimum='0'
Maximum='255'
Background='Blue'
Width='255'
Margin='4'
IsSnapToTickEnabled="True"
TickFrequency="1" />
</StackPanel>
</Window>