循环中的WPF绘制线似乎只绘制一条线

时间:2014-07-09 22:38:42

标签: c# wpf for-loop

我试图在for循环中向画布绘制几行,但似乎只是绘制了一行。我做错了什么?

for (int x = 0; x < 10; x++)
        {
            Random rand = new Random();
            double newTop = rand.Next(0, 50);


            Line top = new Line();
            top.Stroke = Brushes.Black;
            top.StrokeThickness = 2;
            top.Width = 50;

            top.X1 = x * top.Width;
            top.Y1 = 0;
            top.X2 = x * top.Width + top.Width;
            top.Y2 = newTop;

            Canvas.SetTop(top, 0);
            Canvas.SetLeft(top, x * top.Width);
            TheCanvas.Children.Add(top);
        }

感谢, Tarran

2 个答案:

答案 0 :(得分:4)

每次都可以从随机生成器获得相同的值:

  

默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集。“

请参阅Random Constructor

我建议移动

Random rand = new Random();

在循环前面。


此外,从第二步开始,你似乎是在画布之外画画。请尝试使用以下代码:

Random rand = new Random();
for (int x = 0; x < 10; x++)
{
    double newTop = rand.Next(0, 50);

    Line top = new Line();
    top.Stroke = Brushes.Black;
    top.StrokeThickness = x + 1;
    top.Width = 500;

    int width = 50;
    top.X1 = x * width;
    top.Y1 = 0;
    top.X2 = x * width + width;
    top.Y2 = newTop;

    Canvas.SetTop(top, 0);
    Canvas.SetLeft(top, 0 /*x * top.Width*/);
    TheCanvas.Children.Add(top);
}

答案 1 :(得分:0)

你一遍又一遍地绘制同一条线,你需要用不同的东西播种随机数。

Random rand = new Random(Guid.NewGuid().GetHashCode());

您的另一个选择是将随机创建移到循环之外,并像使用Next一样使用Random rand = new Random(); for (int x = 0; x < 10; x++) { double newTop = rand.Next(0, 50); Line top = new Line(); top.Stroke = Brushes.Black; top.StrokeThickness = 2; top.Width = 50; top.X1 = x * top.Width; top.Y1 = 0; top.X2 = x * top.Width + top.Width; top.Y2 = newTop; Canvas.SetTop(top, 0); Canvas.SetLeft(top, x * top.Width); TheCanvas.Children.Add(top); } 。我建议使用这个选项:

Random

这样可以防止{{1}}每次都重新播种。