1

在维护旧的 MFC 应用程序的同时,我们在 WPF 中实现了一个新的进度对话框栏。该应用程序当前的 UI 线程忙于处理大量业务操作,但更改它超出了范围。

当字符串属性更改其值(绑定到 TextBox 的文本)时,进度对话框不会刷新(仅当线程不那么忙时)。

据我所知,属性的更新是从 UI 线程完成的,线程应该能够更新对话框并在继续下一步之前重新绘制它,所以我不明白为什么它没有被更新以及如何修复它。

有任何想法吗?

编辑:这个解决方案的缺点是什么,我已经尝试过了,似乎工作正常:

private static Action EmptyDelegate = delegate() { };

public static void Refresh(this UIElement uiElement)
{
   uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
}
4

3 回答 3

1

我在这里找到了解决方案:

http://eprystupa.wordpress.com/2008/07/28/running-wpf-application-with-multiple-ui-threads/

然后我用进度对话框创建了一个新线程。

于 2012-12-20T12:03:23.243 回答
0

应用程序当前的 UI 线程忙于处理大量业务操作

嗯,有你的问题。你不应该那样做。您应该在非 UI 线程中执行长时间运行的操作。这就是为什么直到长时间运行的操作完成后才对 UI 进行更新的原因。

在执行长时间运行的任务时,您可以使用 aBackgroundWorker来帮助简化与 UI 的交互,因为它将处理对 UI 线程的封送处理,以处理进度更新和完成的事件处理程序。

于 2012-12-11T17:06:19.203 回答
0

首先,我同意@Servy,你不应该在 UI 线程中做繁重的工作。但是,如果您不能在另一个线程中完成这项工作,您可以考虑为您的对话框生成另一个线程。我不知道你是如何调用 wpf 窗口的,但是这个链接可能会给你一些关于如何在 C# 中完成的线索。

于 2012-12-11T17:45:01.173 回答