好的,在Windows窗体中,您可以使用.refresh()
在元素上生成重绘事件。 WPF中是否有类似的解决方案?
我正在做什么的解释,我在画布对象上绘制一个迷宫,并希望看到迷宫被绘制(所以我可以看到进展),而不是等待28分钟突然解决方案出现。我在画布上绘制了一系列Rectangle
s块。刷新应该在矩形还是画布上?
这是最近的输出: http://imgur.com/ftFOv
如果有可能,我想在c#中找到解决方案。感谢。
答案 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线程。 正确修复方法是,不要那样做。
有很多选择,没有更详细的问题,没有办法知道在你的情况下最好的方法是什么。但是,两种最常用且最可能是适当的技术是将BackgroundWorker
或Task.Run()
与Progress<T>
类结合使用。在任何一种情况下,您的算法都在不同的线程中运行,定期将更新传递给UI线程(例如,每个矩形,每十个矩形,无论如何)。 UI线程接收更新,将数据添加到视觉效果,然后返回等待下一次更新。
BackgroundWorker
和Progress<T>
都提供了内置机制,可以自动将数据编组回UI线程。唯一需要注意的是,无论您使用哪个类,都需要在UI线程上创建该类的实例。由于需要在开始执行异步工作之前设置它们,因此这通常不是问题。它是免费的。
如果你这样做,你将不需要任何黑客,例如到目前为止在这里建议的三个不同的黑洞(其中两个似乎不适用于“我已经阻止我的UI线程,现在是什么?“无论如何都是场景。”