Silverlight中的样式触发器

5
我正在尝试在Silverlight中使用样式触发器,代码如下:

   <Path Canvas.Top="20" Stroke="#FF808080" Data="M 0,20 20,0 40,20 Z" StrokeLineJoin="Round">
        <Path.Style>
            <Style TargetType="{x:Type Path}">
                <Setter Property="Fill" Value="DarkGray"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=userControl, Path=PumpRunning}" Value="True">
                        <Setter Property="Fill" Value="DarkGreen"/>        
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Path.Style>
    </Path>

我希望能够做到这一点,以便在泵运行或停止时更改路径的填充值。问题是,在Silverlight中不支持样式触发器!

那么有没有办法绕过这个问题?是否有通过代码完成此操作的方法?我已经研究过了,但却束手无策。

谢谢

Ian

1个回答

13

一个自定义的值转换器可以实现类似的目标。

 public class BoolToBrushConverter : IValueConverter
 {
  public Brush FalseBrush { get; set; }
  public Brush TrueBrush { get; set; }

  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
   if (value == null)
    return FalseBrush;
   else
    return (bool)value ? TrueBrush : FalseBrush;
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
   throw new NotImplementedException("This converter only works for one way binding");
  }
 }

有了这个转换器,您可以调整您的XAML:

 <Path Canvas.Top="20" Stroke="#FF808080" Data="M 0,20 20,0 40,20 Z" StrokeLineJoin="Round">
  <Path.Fill>
   <Binding Path="PumpRunning" ElementName="userControl">
    <Binding.Converter>
     <local:BoolToBrushConverter
      FalseBrush="DarkGray" TrueBrush="DarkGreen" />
    </Binding.Converter>
   </Binding>
  </Path.Fill>
 </Path>
请注意,由于您的颜色选择是针对您的Path定义的局部设置,因此我已经直接将Converter的实例嵌入到我的Path定义中,从而实现了相同的语义。但是,如果您需要使用相同的一组颜色进行多次转换,则可以轻松地将Converter实例放置在页面资源中并使用正常的速记绑定语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接