如何设置多个画布背景以乘以个别颜色?

时间:2018-05-13 10:14:09

标签: c# wpf

我想使用多个画布并为每个画布设置不同的背景。我将canvas的背景分配给随机颜色生成函数。但它只为所有画布返回一种颜色。

wpf例子:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <Canvas Name="canvas1" Grid.Column="0"></Canvas>
    <Canvas Name="canvas2" Grid.Column="1"></Canvas>
</Grid>

c#示例:

    private void SetColor()
    {
         canvas1.Background = new SolidColorBrush(RandomNewColor());
         canvas2.Background = new SolidColorBrush(RandomNewColor());
    }

    private Color RandomNewColor()
    {
        Random RandomColor = new Random();
        Byte[] _byte = new Byte[3];

        RandomColor.NextBytes(_byte);
        byte red = _byte[0];
        byte green = _byte[1];
        byte blue = _byte[2];

        return Color.FromArgb(255, red, green, blue);
    }

1 个答案:

答案 0 :(得分:0)

Random类使用种子值来生成其数字序列。通过在没有参数的情况下调用它,它使用系统时钟作为种子,并且很可能在两个画布控件之间调用太快,因此最终使用相同的种子值。来自docs at Microsoft

  

但是,因为时钟具有有限的分辨率,所以使用了   无参数构造函数,用于在close中创建不同的Random对象   继承创建产生相同的随机数生成器   随机数序列。

您可以在构造函数调用中添加一个参数,但我认为这不会真正解决您的问题。最好移动Random out的实例并将其作为类成员的单个实例。即。

private Random RandomColor = new Random();
private Color RandomNewColor()
    {
        Byte[] _byte = new Byte[3];
        RandomColor.NextBytes(_byte);