我有一个自定义类“FavoriteColor”,它具有三个属性,R, G and 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>
它表示 Color 类的属性 R、G 和 B 不是依赖属性。我知道您只能将数据绑定到依赖属性,但在这种情况下,如何将 R、G 和 B 与矩形的填充颜色绑定。
除了声明一个类型颜色的属性然后在设置 R、G 和 B 时初始化它之外,还有其他方法吗?另外为什么颜色类的 R、G 和 B 不是依赖属性?
让我们使用 MultiBinding 和 IMultiValueConverter 来完成此操作。这是完整的示例。
首先,Window1 的 xaml。我们将设置三个滑块并通过 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>
接下来是转换器。请注意,我在这里没有进行任何错误检查 - 您确实应该检查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
}
就是这样!不需要其他代码隐藏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)