关于在WPF中刷新UI的困惑

本文关键字:UI 刷新 WPF | 更新日期: 2023-09-27 18:02:26

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

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

帮忙吗?

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

关于在WPF中刷新UI的困惑

微软推荐一种稍微不同的方法来实现你的代码使用PushFrame的功能。

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

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

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

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

下面是DispatcherPriority的潜在值列表,它解释了dispatcher运行任务的顺序。