【发布时间】:2011-03-03 07:58:59
【问题描述】:
虽然我对 silverlight 中的标准控件样式很满意,但我最近开始使用更动态的方法来获取要在项目控件中显示的数据。我正在修改的控件之一是链接集合。
我遇到的问题是鼠标悬停时每个链接的颜色不同。一个红色、一个蓝色、一个绿色等。有没有办法在不牺牲使用带有数据模板的项目控件的动态的情况下设置这些项目的样式?
【问题讨论】:
标签: c# silverlight controls templating
虽然我对 silverlight 中的标准控件样式很满意,但我最近开始使用更动态的方法来获取要在项目控件中显示的数据。我正在修改的控件之一是链接集合。
我遇到的问题是鼠标悬停时每个链接的颜色不同。一个红色、一个蓝色、一个绿色等。有没有办法在不牺牲使用带有数据模板的项目控件的动态的情况下设置这些项目的样式?
【问题讨论】:
标签: c# silverlight controls templating
我已经在视图模型的属性上使用了一个简单的转换器来完成此操作,例如,假设您有一个布尔属性,您想要控制可以执行此操作的样式。
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 属性发生更改,这也会使样式保持同步。
如果你想使用比布尔值更复杂的条件,你总是可以在转换器中创建一个对象字典到样式,然后让转换器进行查找,但我发现通常布尔值在大多数情况下都有效。
【讨论】: