如何为wpf datagrid中的每一行设置不同的“随机”颜色?

时间:2017-09-26 06:58:09

标签: c# wpf datagrid

我有一个数据网格,我希望每当用户添加一行时,该行获得一个总随机颜色,如下所示:

do
{
r = (byte)R.Next(0, 255);
b = (byte)R.Next(0, 255);
g = (byte)R.Next(0, 255);
a = (byte)R.Next(128, 255);
}
while (r + b + g < 200);

CellColor.B = b;
CellColor.G = g;
CellColor.R = r;
CellColor.A = a;

所以它不像我在很多问题中那样预编译定义的颜色(如this)。 当我写

时,我的问题出在CellEditEnding事件中
var row = e.Row;
row.Background = new SolidColorBrush(CellColor);

只有第一行获取颜色,其他单元格保持白色。

3 个答案:

答案 0 :(得分:1)

请记住,通过这种方法,无论如何,你可以让它受到缺乏控制的困扰。

如果你跟着另外50行黄色怎么办? 如果最后1000行都有不同的颜色,但它们只是黄色的阴影怎么办?

已提供您所要求的适当答案,但您可能会考虑稍后添加更多逻辑。

  • 例如,您可以将最后X行的颜色存储在列表中,并检查它是否有所不同。
  • 与下一行/当前行之间的行进行比较,如果它太相似则会得到一个新的随机数。
  • 如果当前行r + g + b是前一行r + g + b的X值,那么你知道它们都有很多颜色,可能会考虑获得一个更轻的新随机。

或者您可以制作粗略的预设并将其存储在列表中。从列表中选择一个随机元素,并在r,g,b。

上给它+ -

答案 1 :(得分:0)

颜色重置。您需要在函数中添加此代码并在创建新行之前调用。尝试这样的事情。

 CellColor RandomColor()
 {
  do
  {
     r = (byte)R.Next(0, 255);
     b = (byte)R.Next(0, 255);
     g = (byte)R.Next(0, 255);
     a = (byte)R.Next(128, 255);
  }
  while (r + b + g < 200);

  CellColor.B = b;
  CellColor.G = g;
  CellColor.R = r;
  CellColor.A = a;
  return CellColor;
 }


 var row = e.Row;
 row.Background = new SolidColorBrush(RandomColor());

答案 2 :(得分:0)

这对我有用:

private readonly Random R = new Random();
private void dataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    byte r;
    byte b;
    byte g;
    byte a;
    do
    {
        r = (byte)R.Next(0, 255);
        b = (byte)R.Next(0, 255);
        g = (byte)R.Next(0, 255);
        a = (byte)R.Next(128, 255);
    }
    while (r + b + g < 200);

    Color CellColor = new Color();
    CellColor.B = b;
    CellColor.G = g;
    CellColor.R = r;
    CellColor.A = a;

    var row = e.Row;
    row.Background = new SolidColorBrush(CellColor);
}