2012-04-18 3 views
3

색 눈금에 개별 셀을 색칠하는 방법이 있는지 알아 내려고합니다. 특히, 내가 다음에 보너스 칼럼 같은 것을 얻을 수 있었으면하고 있습니다 :WPF DataGrid - 그레이딩 된 색 눈금의 색 셀

 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(); 
     } 
    } 
} 
: 현재

Color scale example

를, 내가 설정 내 데이터 그리드의 열 배경 속성은 다음과 변환에 바인딩했습니다

값을 하드 코딩하지 않고 색상 비율을 얻는 방법이 있습니까?

덕분에 -

편집을 kcross : 나는 또한 눈에 하드 좀 덜 하나의 측면에서 더 나은 빨강 - 녹색 색상 스케일을 만들려고 해요 (즉, 양수에 부정적인 위해). ... 누군가 그것에 대해 어떤 제안도 있다면 그것은 또한 감사할만한 것입니다!

답변

4

ValueToBrushConverter를 만들었습니다. 이처럼 사용

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

이 빨간색 (YourMaxDouble) 녹색 (YourMinDouble)에서 그라데이션 컬러 스케일을 생성하고 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(); 
    } 
} 
+0

, 그 주셔서 감사합니다! 매우 감사 – keynesiancross