让我们使用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
}
就是这样!不需要其他代码。
<Color R="255" G="200" B="200" A="100" />
在.NET 4.5中可以使用,以防将来有人通过谷歌搜索这个问题。 - DerpyNerd