关于在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
这样的答案对我没有任何帮助。
微软推荐一种稍微不同的方法来实现你的代码使用PushFrame的功能。
代码与呈现无关。它的作用类似于VB6和WinForms中已知的DoEvents
方法。DoEvents
在抽取Windows消息队列并处理队列中的消息时停止程序。这包括任何呈现消息,如WM_PAINT
和WM_NCPAINT
。
代码指示Dispatcher停止当前线程并泵送其队列,并处理优先级为DispatcherPriority的所有消息。渲染或更高。如果队列中有任何待处理的渲染消息,例如,如果框架在某处调用了InvalidateRect
,这些消息将被处理,UI将被重新渲染。
DoEvents
一直被认为是一种代码气味,因为它绕过了消息队列。如果你想要一个响应式的用户界面,你应该使用工作线程。
这可用于根据调用的优先级强制WPF更新UI。由于此调用以同步方式使用Dispatcher,因此任何已经排队的优先级等于或高于DispatcherPriority.Render
的任务将在运行您提供的委托之前运行。
下面是DispatcherPriority的潜在值列表,它解释了dispatcher运行任务的顺序。