Silverlight中的样式触发器

Ian*_*nah 5 silverlight triggers coding-style

我试图在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>
Run Code Online (Sandbox Code Playgroud)

我想这样做,以便在泵运行或不运行时路径的填充值发生变化.问题是silverlight不支持样式触发器!

那么无论如何围绕这个?有没有办法在代码中执行此操作?我已经调查过了,但我很难过.

谢谢

伊恩

Ant*_*nes 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");
  }
 }
Run Code Online (Sandbox Code Playgroud)

使用此转换器,您可以将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>
Run Code Online (Sandbox Code Playgroud)

请注意,由于您的颜色选择是Path定义的本地选择,因此我将Converter的实例直接嵌入到Path定义中,从而实现相同的语义.但是,如果您需要使用相同的对颜色进行大量这些转换,则可以轻松地将Converter实例放在页面资源中并使用常规的速记绑定语法.