我希望在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>我绑定到两个返回类型"Color“的属性,但是我总是收到以下消息:
AG_E_PARSER_BAD_PROPERTY_VALUE如果我试图绑定到一个GradientStop集合,这也有同样的问题,这个问题的解决方案是什么:
如果有工作要重复这种行为--这是可以接受的--我有一些与LinearGradients一起工作的解决方案,因为我可以将一些“填充”属性绑定到它上--但是在这种情况下不起作用,而且可能还有其他渐变类型我可能会使用,其他的也可能在将来使用,这个解决方案/替代方案将适用于这些类型。
发布于 2009-10-03 20:13:41
问题是GradientStop不是从派生的,因此不能绑定数据。不幸的是,这意味着您必须从代码中设置它。
发布于 2009-10-04 13:50:28
要真正做到这一点,你有两个选择。
将显示项刷属性绑定到数据中的刷属性。
让数据源携带一个属性,该属性公开您希望对每个项使用的画笔,并绑定使用该画笔的显示项的属性,例如Fill属性。如果开始值和停止值对的不同值集很小,则此操作是有效的。您将为每对刷子创建一个实例,然后数据项将公开正确的画笔。
使用值转换器绑定显示项刷属性
如果您的开始和停止值的变量更多,您将需要一个新的实例刷子类型为每个显示的项目。在这种情况下,可以使用值转换器绑定显示项画笔属性,例如:-
<Rectangle Fill="{Binding Converter={StaticResource MyBrushBuilder} }" ... >有关构建转换器的完整说明,请参阅此answer。
在这种情况下,虽然您的转换方法实现如下所示:
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;
}警告
每当发生数据绑定时,都会为每个项创建一整串画笔。这可能是昂贵和不受欢迎的。因此,如果认为这种绑定转换方法是必要的,那么我建议您使用笔刷的静态字典。这本词典的关键是这两种颜色的散列。您只会在必要时创建一个新的画笔,并在可能的情况下重用以前创建的画笔。
发布于 2009-10-03 15:02:34
您是否确认了定义梯度刷的DataContext类型?由于您还没有在绑定中指定Source,所以默认情况下它将使用DataContext。
https://stackoverflow.com/questions/1513892
复制相似问题