Почему Rectangle.Fill Multibinding не работает? - PullRequest
0 голосов
/ 22 сентября 2019

Я хочу создать простое приложение 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>

1 Ответ

1 голос
/ 22 сентября 2019

Проверьте вашу реализацию IMultiValueConverter.

Вы можете использовать Color.FromRgb (красный, зеленый, синий);

Работает для меня!

public class RgbToBrushConverter : IMultiValueConverter
{
    public RgbToBrushConverter()
    {

    }

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var x = ExtractColorFrom(values);
        return new SolidColorBrush(x);
    }

    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]);
        return Color.FromRgb(red, green, blue);
    }

    ///MUST!!!!!
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

enter image description here

И отметьте Текст = 'R' x 3?Текст = 'G', 'B'?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...