2009-11-23 50 views
5

我试图使用样式触发器在Silverlight中,像这样:风格触发在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不支持样式触发器!

反正这里有吗?有没有在代码中这样做的一些方法?我已经看过它,但我很难过。

感谢

伊恩

回答

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实例放入页面资源中,并使用普通的速记绑定语法。