大家好日子。这一天到了,我在这里找不到合适的答案,不得不求助于自己。
首先,我对编程很陌生,所以请耐心等待。
我想要做的是让我的画布在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);
}
答案 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