在WPF页面中需要有关Dispatcher.PushFrame样式进程阻止的帮助

use*_*946 6 wpf

我正在使用Dispatcher.PushFrame阻止我的代码,同时允许UI刷新,直到长时间运行的进程完成.这可以按预期工作,只要我对Dispatcher.PushFrame的调用来自按钮单击事件.但是,如果我在Page的Loaded事件或构造函数中使用相同的代码,则UI不会刷新,因此永远不会绘制.作为一个随机实验,我尝试使用构造函数中的Window.ShowDialog,它确实允许UI绘制,即使控件被阻塞直到模态对话框关闭.任何人都可以提供一个解决方案,使用Dispatcher.PushFrame或其他一些手动机制从Page Loaded事件中获取此功能吗?

作为附录,如果我最小化或最大化我的窗口,UI绘制并且我可以正常地与它交互,但直到我手动执行调整大小.

use*_*116 3

从我在 MSDN 上关于对象生命周期事件的阅读以及 Reflector 中的阅读来看,LoadedUnloaded事件的引发方式与其他事件不同。BroadcastEventHelper在内部使用一个类,它协调Loaded可视化树中每个元素之间的各种事件,然后最终将它们提升到级别DispatcherPriority.Loaded

我相信这就是您看到这种行为的原因。

至于具体的解决方案,我建议不要将长时间运行的任务放在Page.Loaded事件处理程序中,而是发出BackgroundWorkerTask来完成工作。