虽然我对Silverlight中的标准控件样式感到满意,但最近我开始使用更动态的方法来获取要在项目控件中显示的数据。我正在重新制作其中一个控件,它是一组链接。
我遇到的问题是每个链接在鼠标悬停时都有不同的颜色。一个红色,一个蓝色,一个绿色等等。是否有一种方式可以在不牺牲使用项控件和数据模板的动态性的情况下对这些项目进行样式设置?
虽然我对Silverlight中的标准控件样式感到满意,但最近我开始使用更动态的方法来获取要在项目控件中显示的数据。我正在重新制作其中一个控件,它是一组链接。
我遇到的问题是每个链接在鼠标悬停时都有不同的颜色。一个红色,一个蓝色,一个绿色等等。是否有一种方式可以在不牺牲使用项控件和数据模板的动态性的情况下对这些项目进行样式设置?
我使用视图模型中的一个简单转换器来完成这个功能。例如,如果您有一个布尔属性,想要控制一个样式,你可以这样做。
public class BoolToStyleConverter : IValueConverter
{
public Style TrueStyle{ get; set; }
public Style FalseStyle{ get; set; }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((bool)value) ? TrueStyle : FalseStyle;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
那么作为资源,您将定义您的两种样式...
<common:BoolToStyleConverter x:Key="BoldTextConverter">
<common:BoolToStyleConverter.TrueStyle>
<Style TargetType="TextBlock">
<Setter Property="FontWeight"
Value="Bold"></Setter>
</Style>
</common:BoolToStyleConverter.TrueStyle>
<common:BoolToStyleConverter.FalseStyle>
<Style TargetType="TextBlock">
<Setter Property="FontWeight"
Value="Normal"></Setter>
</Style>
</common:BoolToStyleConverter.FalseStyle>
</common:BoolToStyleConverter>
那么你可以像这样将它应用到你的对象上...
<TextBlock Text="{Binding Description}"
Margin="20,4,4,4"
Style="{Binding IsConfirmed, Converter={StaticResource BoldTextConverter}}"></TextBlock>
如果在视图模型中有一个名为IsConfirmed的布尔属性,那么这也会使样式与IsConfirmed属性的更改保持同步。
如果您想要使用比布尔更复杂的条件,可以在转换器中创建一个对象到样式的字典,然后让转换器进行查找,但我发现通常情况下布尔值适用于大多数情况。