我正在使用VS2010 - WPF - C#,我正在构建一个证券代码,在列表视图中向用户显示一些值。
我的列表视图如下所示:
<ListView Height="325" Margin="8,8,8,0" x:Name="listView1" VerticalAlignment="Top" BorderThickness="3" FontWeight="Bold" FontSize="12" Foreground="White" Background="{x:Null}" BorderBrush="{x:Null}" Style="{DynamicResource ListViewStyle1}">
<ListView.View>
<GridView>
<GridViewColumn Header="name" DisplayMemberBinding="{Binding company_name}" Width="200" />
<GridViewColumn Header="symbol" DisplayMemberBinding="{Binding symbol}" Width="50" />
<GridViewColumn Header="price" DisplayMemberBinding="{Binding price}" Width="75" />
<GridViewColumn Header="percent " DisplayMemberBinding="{Binding change_percent}" Width="50" />
</GridView>
</ListView.View>
</ListView>
我希望listview中的某些行以红色显示,其他行以绿色显示,具体取决于运行时的百分比值,但我不知道如何。
最好的问候
答案 0 :(得分:5)
要做你想要的,H.B's answer就是它。
但从可用性的角度考虑这一点。有些人是色盲的,会发现某些字体/背景颜色组合难以阅读或无法阅读。您可能更好地考虑在新的第一列中使用颜色椭圆,并根据用户在Windows中的选择保留标准背景/前景颜色。设置椭圆背景画笔的方法与H.B对字体的答案相同。
即使对于没有色盲的人来说,尝试在白色背景上阅读明亮的绿色文字也可能具有挑战性(例如,想象那些人坐在他们身后的窗户旁边)。
只是一个想法。
答案 1 :(得分:3)
将对照的Foreground
绑定到change_percent
并使用ValueConverter将其变为Brush
。
这是一个基本的转换器,从红色变为黄色到绿色:
public class PercentToBrushConverter : IValueConverter
{
//http://stackoverflow.com/questions/3722307/is-there-an-easy-way-to-blend-two-system-drawing-color-values/3722337#3722337
private Color Blend(Color color, Color backColor, double amount)
{
byte r = (byte)((color.R * amount) + backColor.R * (1 - amount));
byte g = (byte)((color.G * amount) + backColor.G * (1 - amount));
byte b = (byte)((color.B * amount) + backColor.B * (1 - amount));
return Color.FromRgb(r, g, b);
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//Assumes the percent property to be an int.
int input = (int)value;
Color red = Colors.Red;
Color yellow = Colors.Yellow;
Color green = Colors.Green;
Color color;
if (input <= 50)
{
color = Blend(yellow, red, (double)input/50);
}
else
{
color = Blend(green, yellow, (double)(input - 50) / 50);
}
return new SolidColorBrush(color);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
您可以这样使用:
<ListView>
<ListView.Resources>
<vc:PercentToBrushConverter x:Key="PercentToBrushConverter"/>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn Header="Progress">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<!-- An indicator ellipse as suggested by Neil Barnwell -->
<Ellipse Height="16" Width="16" Fill="{Binding change_percent, Converter={StaticResource PercentToBrushConverter}}"/>
<TextBlock Margin="5,0,0,0" Text="{Binding change_percent}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<!-- ... -->
</GridView>
</ListView.View>
</ListView>
如何进行xmlns
声明:
您需要在某个命名空间中定义类:
namespace MySolution.ValueConverters
{
public class PercentToBrushConverter : IValueConverter { /*...*/ }
}
此命名空间可以映射到Window
或任何其他父控件:
<Window ...
xmlns:vc="clr-namespace:MySolution.ValueConverters">
这会将MySolution.ValueConverters
命名空间映射到vc
前缀。有关更多参考see MSDN。