ValueConverter用于背景颜色

时间:2014-12-28 06:39:03

标签: wpf windows-8.1

我有一个预测课程。其中一个字段是Enum:

enum GeneralForecast
{
    Sunny,
    Rainy,
    Snowy,
    Cloudy,
    Dry
}

class Forecast
{
    public GeneralForecast GeneralForecast { get; set; }
    public double TemperatureHigh { get; set;  }
    public double TemperatureLow { get; set; }
    public double Percipitation { get; set; }
}

我在ListBox上显示预测列表,我想在ListBox中设置项目的BackgroundColor取决于GeneralForecast。

所以我创建了Converter:

类GeneralForecastToBrushConverter:IValueConverter     {

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var gf = (GeneralForecast) value;
        switch (gf) 
        {
            case GeneralForecast.Cloudy:
                return "FF1D1D1D";
            case GeneralForecast.Dry:
                return "55112233";
            case GeneralForecast.Rainy:
                return "88FF5522";
            case GeneralForecast.Snowy:
                return "9955FF22";
            case GeneralForecast.Sunny:
                return "FF11FF99";
        }
        return "FFFFFFFF";
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

这是我的XAML:

<Page.Resources>
    <local:GeneralForecastToBrushConverter x:Key="gf2color"/>
</Page.Resources>

<ListBox ItemsSource="{Binding}" Grid.Row="2" HorizontalAlignment="Stretch">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border Margin="4" BorderBrush="Black" Padding="4" 
                        BorderThickness="2" 
                        Background="{Binding GeneralForecast, Converter={StaticResource gf2color}}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock FontSize="20" FontWeight="Bold" 
                                   Text="{Binding GeneralForecast}"/>                            
                    </StackPanel>
                </Border>
            </DataTemplate>                
        </ListBox.ItemTemplate>
    </ListBox>

如果我调试我的转换器,我可以看到它返回不同的颜色,但我有所有项目相同的颜色。为什么?

1 个答案:

答案 0 :(得分:2)

当你在XAML中写这样的东西时:

<Button Background="#FF11111" />

Xaml解析器将在运行时将该字符串转换为其等效颜色。

但是当你以某种方式在C#中指定颜色时,你可能不会将颜色设置为字符串。

相反,你应该使用类似SolidColorBrush实例的东西。

因此返回一些变量,即Brush,例如实心或渐变颜色画笔。

如果需要任何其他信息,请告诉我。