如何在Silverlight中绑定GradientStop Colors或GradientStops属性?

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,这也有同样的问题,这个问题的解决方案是什么:

  1. 允许在运行时更改渐变的开始和结束
  2. 适用于Silverlight 3.0,不是WPF解决方案

如果有工作或者无论如何都要复制这种行为,这是可以接受的,我有解决方案可以使用LinearGradients,因为我可以将某些东西"填充"属性绑定到此 - 但是在这种情况下不起作用,加上可能是我可能使用的其他渐变类型,其他人可能会在将来使用此解决方案/替代方案.

Sha*_*uth 13

问题是GradientStop不是从FrameworkElement派生的,因此不能绑定数据.不幸的是,这意味着你必须从代码中设置它.


Ant*_*nes 5

要真正做到这一点,你有两个选择.

将显示项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)

警告

每当发生数据绑定时,就会为每个项目创建一组刷子.这可能是昂贵且不合需要的.因此,如果认为这种绑定转换器方法是必要的,那么我建议你使用静态的画笔字典.这本词典的关键是两种颜色的哈希.您只需在必要时创建新画笔,并尽可能重复使用以前创建的画笔.