15

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

解释我在做什么,我正在画布对象上绘制一个迷宫,并且想观察迷宫的绘制(所以我可以看到进度),而不是等待 28 分钟才能突然出现解决方案。我在画布上用一系列Rectangles 绘制块。刷新应该在矩形还是画布上?

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

如果可能的话,我想要一个 c# 中的解决方案。谢谢。

4

4 回答 4

38

这就是你要找的...

element.InvalidateVisual();
于 2012-03-22T10:53:50.767 回答
15

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

element.UpdateLayout();
于 2013-03-11T19:52:58.370 回答
11

您可能想要使用Dispatcher对象。我建议您阅读这篇 Shawn Wildermuth 的文章:使用 Dispatcher 构建更具响应性的应用程序(MSDN 杂志 2007 年 10 月)。

于 2011-05-11T05:38:16.977 回答
5

如果没有一个好的最小、完整和可验证的代码示例来清楚地显示你在做什么,就不可能确定这里的最佳答案是什么。但是,根据您的描述,迷宫生成算法似乎正在 UI 线程中执行,从而阻止 UI 自行更新。

就像在 Winforms 的情况下,人们很想调用类似Refresh()orApplication.DoEvents()的方法,这里真正的问题是你阻塞了 UI 线程。解决这个问题的正确方法是,不要那样做

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

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

如果你这样做,你将不需要任何技巧,比如到目前为止这里建议的三个不同的技巧(其中两个似乎不太可能适用于“我已经阻止了我的 UI 线程,现在怎么办?”无论如何)。

于 2016-06-23T17:11:00.040 回答