2012-04-18 11 views
3

カラースケール上の個々のセルをカラーリングする方法があるかどうかを判断しようとしています。特に、私は次のようにボーナス列のようなものを得るために期待しています:WPF DataGrid - グレーデッドカラースケールのカラーセル

現在

Color scale example

、私は次のコンバータに結合するセットアップ私のDataGridの列のbackgroundプロパティをしました:

 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

編集:私はまた目のハード少し小さい1の観点では、(つまり、正の数と負のために)より良い赤 - 緑のカラースケールを作成しようとしています。 ...誰かがそれについての提案をも持っているなら、それはまた評価されます!

答えて

4

私はValueToBrushConverterを作成しました。あなたはこのようにそれを使用します。

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

これは(YourMinDouble)緑から赤(YourMaxDouble)にグラデーションカラースケールを作成し、YourDoubleValueための関連色を選択します。 YourMinDoubleは否定できないが、それより小さいものでなければならない。YourMaxDoubleYourDoubleValueが範囲外の場合は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(); 
    } 
} 
+0

、そのためにありがとう!とても有難い – keynesiancross