WPF强制重绘canvas

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

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

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

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

您可能想要使用Dispatcher对象。 我建议你看一下Shawn Wildermuth的文章: 使用Dispatcher构建更多响应式应用程序 (MSDN杂志2007年10月)。

这就是你要找的……

 element.InvalidateVisual(); 

这项工作对我来说……

 element.UpdateLayout(); 

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

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

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

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

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