Привязка свойств R G B раскрашивает wpf

У меня есть пользовательский класс, "FavoriteColor", который имеет три свойства, R, G и B. Теперь я хочу потянуть прямоугольник и заполнить его этими R, G и значениями B (использующий связывающий с данными). Я попробовал следующий отрывок в своем xaml, но даю мне ошибку времени компиляции.

                <Rectangle Width="10" Height="10" Grid.Column="4">
                    <Rectangle.Fill>
                        <SolidColorBrush>
                            <SolidColorBrush.Color>
                                <Color R="{Binding Path=R}" />
                                <Color G="{Binding Path=G}" />
                                <Color B="{Binding Path=B}" />
                            </SolidColorBrush.Color>
                        </SolidColorBrush>
                    </Rectangle.Fill>
                </Rectangle>

Это говорит, что свойства R, G и B Цветного класса не являются свойствами зависимости. Я знаю, что можно связать данные только со свойствами зависимости, но в этом случае, как я связываю свой R, G и B с цветом заливки прямоугольника.

Есть ли какой-либо другой путь кроме путем объявления еще одного свойства цвета шрифта и затем инициализации его, когда R, G и B установлены? Также, почему R, G и B цветного класса не являются свойствами зависимости?

5
задан sudarsanyes 30 December 2009 в 03:50
поделиться

1 ответ

Сделаем это с помощью MultiBinding и IMultiValueConverter. Вот полный пример.

Во-первых, xaml для Window1. Установим три ползунка и привяжем их значения к свойству Window's Background с помощью SolidColorBrush.

<Window x:Class="WpfApplication16.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:WpfApplication16"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <my:RgbConverter x:Key="RgbConverter" />
    </Window.Resources>
    <Window.Background>
        <SolidColorBrush>
            <SolidColorBrush.Color>
                <MultiBinding Converter="{StaticResource RgbConverter}">
                    <Binding Path="Value" ElementName="redSlider" />
                    <Binding Path="Value" ElementName="greenSlider" />
                    <Binding Path="Value" ElementName="blueSlider" />
                </MultiBinding>
            </SolidColorBrush.Color>
        </SolidColorBrush>
    </Window.Background>
    <StackPanel>
        <Slider Minimum="0" Maximum="255" x:Name="redSlider" />
        <Slider Minimum="0" Maximum="255" x:Name="greenSlider" />
        <Slider Minimum="0" Maximum="255" x:Name="blueSlider" />
    </StackPanel>
</Window>

Далее, конвертер. Обратите внимание, что здесь я не делаю проверку на ошибки - действительно нужно проверить, что длина массива значений равна 3, а отдельные значения - это действительные байты и т.д.

public class RgbConverter : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var r = System.Convert.ToByte(values[0]);
        var g = System.Convert.ToByte(values[1]);
        var b = System.Convert.ToByte(values[2]);

        return Color.FromRgb(r, g, b);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Вот и все! Другого кода нет необходимости.

4
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: