在WPF中C#重绘画布

时间:2014-12-23 08:56:57

标签: c# wpf canvas

大家好日子。这一天到了,我在这里找不到合适的答案,不得不求助于自己。

首先,我对编程很陌生,所以请耐心等待。

我想要做的是让我的画布在wpf中重绘一些我随机颜色随机点生成的正方形。

制作正方形的代码工作正常,但我无法弄清楚如何使画布在for循环结束时重绘0-2个新正方形(在最后,正好在Thread.sleep代码)。我尝试了很多在网上找到的建议,比如canvas.InvalidateVisual和canvas.InvalidateMeasure,但它们似乎没有用。画布只会更新,所有新创建的方块都经过了所有循环。

仅供参考:我知道我已经注释掉了重绘电话。我只是把它们留在那里,所以你知道我试图放置它们的位置。

        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                newX = rand.Next(4);
                newY = rand.Next(4);
                index = 0;
                writable = true;

                foreach (var Square in size8)
                {
                    if (newX == size8[index].X && newY == size8[index].Y)
                    {
                        writable = false;
                        break;
                    }
                    index++;
                }

                if (writable == true)
                {
                    size8.Add(new Square
                    {
                        Usable = true,
                        X = newX,
                        Y = newY
                    });
                }
            }

            index = 0;

            foreach (var Square in size8)
            {
                Rectangle rect = new Rectangle();
                Color randomColor = Color.FromArgb(
                    (byte)rand.Next(0, 255),
                    (byte)rand.Next(0, 255),
                    (byte)rand.Next(0, 255),
                    (byte)rand.Next(0, 255));
                rect.Fill = new SolidColorBrush(randomColor);
                rect.Width = 128;
                rect.Height = 128;

                Canvas.SetLeft(rect, (512 / 4 * size8[index].X));
                Canvas.SetTop(rect, (512 / 4 * size8[index].Y));

                MainCanvas.Children.Add(rect);

                index++;

            }

            //MainCanvas.InvalidateArrange();
            //MainCanvas.InvalidateMeasure();
            //MainCanvas.InvalidateProperty();
            //MainCanvas.InvalidateVisual();

            Thread.Sleep(200);


        }

1 个答案:

答案 0 :(得分:-1)

Dispatcher可以帮助您完成此类任务。这篇介绍性文章对您有很大帮助

http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

基本上,我们的想法是你需要告诉UI线程再次刷新画布。 Windows和WPF遵循以线程为中心的模型:每个窗口在指定的线程上运行,该线程负责绘制/刷新它。 WPF API提供了触发它的显式机制。

此外,还有关于它的MSDN文档。

http://msdn.microsoft.com/en-us/library/ms741870%28v=vs.110%29.aspx