3

カラースケールで個々のセルに色を付ける方法があるかどうかを調べようとしています。特に、次のボーナス列のようなものを取得したいと考えています。

カラースケールの例

現在、データグリッドの列の背景プロパティを次のコンバーターにバインドするように設定しました。

        public class NameToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            double? input = value as double?;
            if(input<-5)
            {
                return Brushes.MediumVioletRed;
            }
            if(-5<=input && input<-0.5)
            { 
                return Brushes.IndianRed;
            }
            if (.5 <= input && input < 5)
            { 
                return Brushes.LightGreen; 
            }
            if (5 <= input)
            { 
                return Brushes.LawnGreen; 
            } 

             return DependencyProperty.UnsetValue;            
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}

値をハードコーディングせずにカラースケールを取得する方法はありますか?

ありがとう - kcross

編集:私はまた、目に少し負担が少ないという点で、より良い赤緑のカラースケール(つまり、負から正の数)を作成しようとしています....誰かがそれについて何か提案があればそれもありがたいです!

4

1 に答える 1

6

ValueToBrushConverter を作成しました。次のように使用します。

Background="{Binding Path=YourDoubleValue,
                     Converter={StaticResource ValueToBrushConverter},
                     ConverterParameter='YourMinDouble|YourMaxDouble'}"

YourMinDoubleこれにより、緑 ( ) から赤 ( ) へのグラデーション カラー スケールが作成されYourMaxDouble、 に関連する色が選択されYourDoubleValueます。YourMinDoubleは負になる可能性がありますが、それより小さくする必要がありますYourMaxDouble。が範囲内にない場合YourDoubleValueは、 を返しますBrushes.Transparent
あなたのニーズに合わせてカスタマイズしてください!

ConverterClass

[ValueConversion(typeof(double), typeof(Brush))]
class ValueToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double number = (double)value;
        double min = 0;
        double max = 100;

        // Get the value limits from parameter
        try
        {
            string[] limits = (parameter as string).Split(new char[] { '|' });
            min = double.Parse(limits[0], CultureInfo.InvariantCulture);
            max = double.Parse(limits[1], CultureInfo.InvariantCulture);
        }
        catch (Exception)
        {
            throw new ArgumentException("Parameter not valid. Enter in format: 'MinDouble|MaxDouble'");
        }

        if (max <= min)
        {
            throw new ArgumentException("Parameter not valid. MaxDouble has to be greater then MinDouble.");
        }

        if (number >= min && number <= max)
        {
            // Calculate color channels
            double range = (max - min) / 2;
            number -= max - range;
            double factor = 255 / range;
            double red = number < 0 ? number * factor : 255;
            double green = number > 0 ? (range - number) * factor : 255;

            // Create and return brush
            Color color = Color.FromRgb((byte)red, (byte)green, 0);
            SolidColorBrush brush = new SolidColorBrush(color);
            return brush;
        }

        // Fallback brush
        return Brushes.Transparent;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-04-21T10:21:22.767 に答える