在 WPF 中绑定颜色的 R、G、B 属性

6

我有一个自定义类"FavoriteColor",它有三个属性RGB。现在我想画一个矩形,并用这些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>

它说Color类的属性R、G和B不是依赖属性。我知道只有依赖属性才可以绑定数据,但在这种情况下,我应该如何将我的R、G和B与矩形填充颜色绑定呢?

除了声明另一个类型为color的属性并在设置R、G和B时进行初始化之外,还有其他方法吗?此外,为什么Color类的R、G和B不是依赖属性?


2
我知道这是2009年的帖子。我偶然发现了这个。 我发现这个代码:<Color R="255" G="200" B="200" A="100" />在.NET 4.5中可以使用,以防将来有人通过谷歌搜索这个问题。 - DerpyNerd
1个回答

6

让我们使用MultiBinding和IMultiValueConverter来实现这个。以下是完整的示例。

首先,是Window1的xaml。我们将设置三个滑块并通过SolidColorBrush将它们的值绑定到窗口的Background属性。

<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>

接下来是转换器。请注意,我在这里没有进行任何错误检查 - 您确实应该检查values数组的长度是否为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
}

就是这样!不需要其他代码。


哇,太棒了。我只知道 IValueConverter,不知道 IMultiValueConverter。非常感谢。 - sudarsanyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接