Rog*_*oid 5 silverlight xaml binding gradient gradientstop
我希望能够在Silverlight中拥有动态渐变,如下所示:
<RadialGradientBrush GradientOrigin="0.20,0.5" Center="0.25,0.50"
RadiusX="0.75" RadiusY="0.5">
<GradientStop Color="{Binding Path=GradientStart}" Offset="0" />
<GradientStop Color="{Binding Path=GradientEnd}" Offset="1" />
</RadialGradientBrush>
Run Code Online (Sandbox Code Playgroud)
我绑定到两个返回类型"颜色"的属性,但我总是收到此消息:
AG_E_PARSER_BAD_PROPERTY_VALUE
Run Code Online (Sandbox Code Playgroud)
如果我尝试绑定到GradientStop Collection,这也有同样的问题,这个问题的解决方案是什么:
如果有工作或者无论如何都要复制这种行为,这是可以接受的,我有解决方案可以使用LinearGradients,因为我可以将某些东西"填充"属性绑定到此 - 但是在这种情况下不起作用,加上可能是我可能使用的其他渐变类型,其他人可能会在将来使用此解决方案/替代方案.
要真正做到这一点,你有两个选择.
将显示项Brush属性绑定到数据中的Brush属性
让数据源带有一个属性,该属性会为每个项目公开要使用的画笔,并绑定显示项目的属性,即获取画笔,例如Fill
属性.如果您对Start和Stop值对的一组不同值很小,则此方法有效.您将为每对创建每个画笔的实例,然后数据项将显示正确的画笔.
使用值转换器绑定显示项刷属性
如果"开始"和"停止"值为更多变量,则每个显示的项目都需要刷新类型的新实例.在这种情况下,您将使用值转换器绑定显示项刷属性,例如: -
<Rectangle Fill="{Binding Converter={StaticResource MyBrushBuilder} }" ... >
Run Code Online (Sandbox Code Playgroud)
有关构建转换器的完整说明,请参阅此答案.
在这种情况下,虽然您的转换方法实现将如下所示: -
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
YourItemsType item = (YourItemsType)value;
var start = new GradientStop();
start.Offset = 0;
start.Color = item.GradientStart;
var stop = new GradientStop();
stop.Offset = 1;
stop.Color = item.GradientStop;
var result = new RadialGradientBrush();
result.GradientOrigin = new Point(0.20, 0.5);
result.Center = new Point(0.25, 0.5);
result.RadiusX = 0.75;
result.RadiusY = 0.5;
result.GradientStops = new GradientStopCollection();
result.GradientStops.Add(start);
result.GradientStops.Add(stop);
return result;
}
Run Code Online (Sandbox Code Playgroud)
警告
每当发生数据绑定时,就会为每个项目创建一组刷子.这可能是昂贵且不合需要的.因此,如果认为这种绑定转换器方法是必要的,那么我建议你使用静态的画笔字典.这本词典的关键是两种颜色的哈希.您只需在必要时创建新画笔,并尽可能重复使用以前创建的画笔.