WPF强制重绘画布

时间:2011-05-11 04:21:42

标签: c# wpf wpf-controls redraw

好的,在Windows窗体中,您可以使用.refresh()在元素上生成重绘事件。 WPF中是否有类似的解决方案?

我正在做什么的解释,我在画布对象上绘制一个迷宫,并希望看到迷宫被绘制(所以我可以看到进展),而不是等待28分钟突然解决方案出现。我在画布上绘制了一系列Rectangle s块。刷新应该在矩形还是画布上?

这是最近的输出: http://imgur.com/ftFOv

如果有可能,我想在c#中找到解决方案。感谢。

4 个答案:

答案 0 :(得分:29)

这就是你要找的......

element.InvalidateVisual();

答案 1 :(得分:12)

这项工作对我来说......

element.UpdateLayout();

答案 2 :(得分:8)

您可能想要使用Dispatcher对象。我建议你看一下Shawn Wildermuth的文章:Build More Responsive Apps With The Dispatcher(MSDN杂志2007年10月)。

答案 3 :(得分:4)

如果没有一个好的Minimal, Complete, and Verifiable code example来清楚地表明你在做什么,就不可能确切知道这里最好的答案是什么。但是,根据您的描述,听起来好像迷宫生成算法正在UI线程中执行,阻止UI更新自身。

就像Winforms一样,人们很想调用Refresh()Application.DoEvents()等方法,这里的真正问题是你阻止了UI线程正确修复方法是,不要那样做

有很多选择,没有更详细的问题,没有办法知道在你的情况下最好的方法是什么。但是,两种最常用且最可能是适当的技术是将BackgroundWorkerTask.Run()Progress<T>类结合使用。在任何一种情况下,您的算法都在不同的线程中运行,定期将更新传递给UI线程(例如,每个矩形,每十个矩形,无论如何)。 UI线程接收更新,将数据添加到视觉效果,然后返回等待下一次更新。

BackgroundWorkerProgress<T>都提供了内置机制,可以自动将数据编组回UI线程。唯一需要注意的是,无论您使用哪个类,都需要在UI线程上创建该类的实例。由于需要在开始执行异步工作之前设置它们,因此这通常不是问题。它是免费的。

如果你这样做,你将不需要任何黑客,例如到目前为止在这里建议的三个不同的黑洞(其中两个似乎不适用于“我已经阻止我的UI线程,现在是什么?“无论如何都是场景。”