2009-11-23 86 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實例放入頁面資源中,並使用普通的速記綁定語法。