1

データグリッド内の個々のセルを輝かせる方法を考えています。

このようなドロップシャドウ効果をグリッド全体に適用できることを私は知っています:

 [data:DataGrid.Effect>
  [DropShadowEffect BlurRadius="100" ShadowDepth="0" Color="Red"/>
 [/data:DataGrid.Effect>

しかし、私が本当にやりたいのは、値が 100 以上のときに個々のセルを赤く光らせることです。大きなグリッドの籾殻から小麦を選別するのは、視覚的に少し良いことです。

4

1 に答える 1

2

私は少し前に同様の要件を持っていましたが、それを次のように解決しました。

もちろん、DataGridはテンプレート化できるので、基本的には次のように列をテンプレート化し、このセルにバインドされたデータに従ってウィジェットの背景をペイントするコンバーターを用意しました。

<data:DataGridTemplateColumn Header="Overall">
                    <data:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Border Effect="{StaticResource StatusBorderDropShadow}" 
                                Background="{Binding Overall, Converter={StaticResource MiniStatusLightConverter}, Mode=TwoWay}" 
                                Style="{StaticResource StatusBorder}" >                                     
                                <Border.BorderBrush>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="Black" Offset="0"/>
                                        <GradientStop Color="#FF0D9C3B" Offset="1"/>
                                    </LinearGradientBrush>
                                </Border.BorderBrush>
                            </Border>
                </DataTemplate>
                    </data:DataGridTemplateColumn.CellTemplate>

MiniStatusLightConverterをどのように使用するかを示すバックグラウンドバインディングを見てください。

これがコンバーターです。あなたの場合、値が100以上かどうかを確認します。

>名前空間MyProject.Converters{パブリッククラスStatusToBrushConverter:IValueConverter{#regionIValueConverterの実装

private Dictionary<string, List<Color>> colorsMap;

public StatusToBrushConverter()
{
  colorsMap = new Dictionary<string, List<Color>>
                {
                  { "Green", new List<Color> { GetColorFromHexString("#FFC1D7BF"), GetColorFromHexString("#FF21C110"), GetColorFromHexString("#FF074431") } },
                  { "Yellow", new List<Color> { GetColorFromHexString("#FFF2F3EA"), GetColorFromHexString("#FFD7CB10"), GetColorFromHexString("#FFDEFE00") } },
                  { "Red", new List<Color> { GetColorFromHexString("#FFF3EEEA"), GetColorFromHexString("#FFC13C10"), GetColorFromHexString("#FFFE1000") } }
                };
}

public static Color GetColorFromHexString(string s)
{
  s = s.Remove(0, 1);
  var a = System.Convert.ToByte(s.Substring(0, 2), 16);
  var r = System.Convert.ToByte(s.Substring(2, 2), 16);
  var g = System.Convert.ToByte(s.Substring(4, 2), 16);
  var b = System.Convert.ToByte(s.Substring(6, 2), 16);
  return Color.FromArgb(a, r, g, b);
}

public static string GetColourName(object dtoValue)
{
  try
  {
    var str = dtoValue.ToString();
    if (str.Contains("#"))
    {
      return str.Split('#')[1];
    }
    return str;
  }
  catch (IndexOutOfRangeException)
  {
    return string.Empty;
  }
}

public object Convert(object dtoValue, Type targetType, object parameter, CultureInfo culture)
{
  return new RadialGradientBrush
                      {
                        RadiusX = 0.784, 
                        RadiusY = 0.786, 
                        GradientOrigin = new Point(0.88, 0.115),
                        GradientStops = GetGradientStopCollection(GetColourName(dtoValue)), 
                        RelativeTransform = GetTransformGroupForEffect()
                      };
}

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

#endregion

public object GetBasicSolidColorBrush(object dtoValue)
{
  var blueBrush = new SolidColorBrush();

  if (dtoValue == null)
  {
    blueBrush.Color = Colors.White;
    return blueBrush;
  }

  var value = GetColourName(dtoValue);

  if (value == "Green")
  {
    blueBrush.Color = Colors.Green;
  }
  else if (value == "Yellow")
  {
    blueBrush.Color = Colors.Yellow;
  }
  else if (value == "Red")
  {
    blueBrush.Color = Colors.Red;
  }
  else
  {
    blueBrush.Color = Colors.White;
  }

  return blueBrush;
}

private TransformGroup GetTransformGroupForEffect()
{
  var transform = new TransformGroup();
  transform.Children.Add(new ScaleTransform { CenterX = 0.5, CenterY = 0.5 });
  transform.Children.Add(new SkewTransform { AngleX = 0.0, AngleY = 0.0, CenterX = 0.5, CenterY = 0.5 });
  transform.Children.Add(new RotateTransform { Angle = 4.548, CenterX = 0.5, CenterY = 0.5 });
  return transform;
}

private GradientStopCollection GetGradientStopCollection(string colorValue)
{
  var gradientStopCollection = new GradientStopCollection();

  var stop1 = new GradientStop { Offset = 0.0 };
  var stop2 = new GradientStop { Offset = 0.200 };
  var stop3 = new GradientStop { Offset = 0.858 };

  stop1.Color = colorsMap[colorValue][0];
  stop2.Color = colorsMap[colorValue][1];
  stop3.Color = colorsMap[colorValue][2];

  gradientStopCollection.Add(stop1);
  gradientStopCollection.Add(stop2);
  gradientStopCollection.Add(stop3);

  return gradientStopCollection;
}

}}

少なくともこれがあなたにアイデアをもたらすことを願っています。私が試したもう1つのアプローチは、ユーザーコントロールを作成し、境界線だけでなくCellTemplateに配置することでしたが、問題が発生し、ユーザーはこの機能について叫んでいました。それは機能し、ユーザーは満足しています。それも重要です。

お役に立てば幸いです

于 2010-01-07T04:04:34.360 に答える