5

我听说这会刷新 UI,但为什么呢?Dispatcher调用这个空动作,就是没有调用InvalidateMeasure()会触发 UI 在动作内部重新测量、重新排列和重新渲染。update/refreshUI的度量和安排流程在哪里?

private static Action EmptyDelegate = delegate() { };

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

有什么帮助吗?

EDITED:我想知道为什么渲染 UI 的细节。像这样的答案well that triggers ui update对我没有任何帮助。

4

2 回答 2

3

Microsoft 建议使用稍微不同的方式来执行您的代码使用PushFrame所做的事情。

该代码与渲染无关。它的作用类似于DoEventsVB6 和 WinForms 中已知的方法。 DoEvents在抽取 Windows 消息队列并处理队列中的消息时暂停程序。这包括任何呈现消息,例如WM_PAINTWM_NCPAINT

该代码指示 Dispatcher 停止当前线程并抽取其队列并处理具有 DispatcherPriority.Render 或更高优先级的所有消息。如果队列中有任何待处理的渲染消息,例如,如果InvalidateRect框架已在某处调用,则将处理这些消息并重新渲染 UI。

DoEvents一直被认为是代码异味,因为它绕过了消息队列。如果你想要一个响应式的用户界面,你应该使用工作线程。

于 2013-03-07T10:33:40.380 回答
1

由于调用的优先级,这可用于强制 WPF 更新 UI。由于此调用同步使用 Dispatcher,因此任何已经以相同或更高优先级排队的任务都DispatcherPriority.Render将在运行您提供的委托之前运行。

这是DispatcherPriority的潜在值列表,它解释了调度程序运行的订单任务。

于 2013-03-06T15:29:21.797 回答