2017-09-26 132 views
-3

我有一个DataGrid,我想,只要用户添加行,该行获得一个总随机颜色如下:如何为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); 

只有第一行得到的颜色和其他细胞保持白色。

回答

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()); 
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); 
} 
1

请记住,使用这种方法,但是rainbow'ish你得到它从一个缺乏控制的缺点。

,如果你得到以下海誓山盟50个黄行么? 如果最后的1000行都有不同的颜色,但它们只是黄色的色调?

适当的答案对你要求已经提供了什么,但你可能会考虑增加更多的逻辑以后。

  • 例如,您可以将最后X行的颜色存储在列表中,并检查它是否有所不同。
  • 比较与下面的行/对当前的顶部,这样就得到一个新的随机,如果是太相似了。
  • 如果当前行R + G + B是从以前的行R + G + B,则X值,你知道,他们俩都得到了很多的色彩,可能会考虑让一个新的随机那是轻。

也可以使粗糙的预设,并将它们存储在列表中。从列表中选择一个随机元素并在r,g,b上给它+ - 。

相关问题