好的,在 Windows 窗体中,您可以使用.refresh()
它在元素上引发重绘事件。WPF中是否有类似的解决方案?
解释我在做什么,我正在画布对象上绘制一个迷宫,并且想观察迷宫的绘制(所以我可以看到进度),而不是等待 28 分钟才能突然出现解决方案。我在画布上用一系列Rectangle
s 绘制块。刷新应该在矩形还是画布上?
这是最近的输出:http: //imgur.com/ftFOv
如果可能的话,我想要一个 c# 中的解决方案。谢谢。
好的,在 Windows 窗体中,您可以使用.refresh()
它在元素上引发重绘事件。WPF中是否有类似的解决方案?
解释我在做什么,我正在画布对象上绘制一个迷宫,并且想观察迷宫的绘制(所以我可以看到进度),而不是等待 28 分钟才能突然出现解决方案。我在画布上用一系列Rectangle
s 绘制块。刷新应该在矩形还是画布上?
这是最近的输出:http: //imgur.com/ftFOv
如果可能的话,我想要一个 c# 中的解决方案。谢谢。
这就是你要找的...
element.InvalidateVisual();
这项工作对我来说......
element.UpdateLayout();
您可能想要使用Dispatcher对象。我建议您阅读这篇 Shawn Wildermuth 的文章:使用 Dispatcher 构建更具响应性的应用程序(MSDN 杂志 2007 年 10 月)。
如果没有一个好的最小、完整和可验证的代码示例来清楚地显示你在做什么,就不可能确定这里的最佳答案是什么。但是,根据您的描述,迷宫生成算法似乎正在 UI 线程中执行,从而阻止 UI 自行更新。
就像在 Winforms 的情况下,人们很想调用类似Refresh()
orApplication.DoEvents()
的方法,这里真正的问题是你阻塞了 UI 线程。解决这个问题的正确方法是,不要那样做。
有很多选择,如果没有更详细的问题,就无法知道在您的情况下什么是最好的方法。但是,两种最常用且最可能合适的技术是使用BackgroundWorker
或Task.Run()
与Progress<T>
类结合使用。在任何一种情况下,您的算法都会在不同的线程中运行,定期将更新传递给 UI 线程(例如,每个矩形、每十个矩形等等)。UI 线程接收更新,将数据添加到视觉对象,然后返回等待下一次更新。
BackgroundWorker
并且Progress<T>
两者都提供了自动将数据编组回 UI 线程的内置机制。唯一需要注意的是,无论您使用这些类中的哪一个,都需要在 UI 线程上创建该类的实例。由于它们需要在您开始执行异步工作之前进行设置,因此这通常不是问题;它是免费的。
如果你这样做,你将不需要任何技巧,比如到目前为止这里建议的三个不同的技巧(其中两个似乎不太可能适用于“我已经阻止了我的 UI 线程,现在怎么办?”无论如何)。