WPF中关于刷新UI的困惑

5

我听说这个可以刷新UI,但为什么呢?Dispatcher调用了这个空操作,就这样,没有调用InvalidateMeasure(),它会触发UI重新测量、重新排列和重新渲染。在这里,哪里进行测量和排列的过程来更新/刷新UI?

private static Action EmptyDelegate = delegate() { };

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

需要帮忙吗?

编辑:我想知道为什么会渲染UI的详细信息。像“这将触发UI更新”这样的答案并没有给我帮助。


当你写下"I have heard that this refreshes the UI" 或者"This seems is a common way to refresh a control in wpf",听起来好像是你从某个地方得到了这个想法。很有意思想知道具体是从哪里得到的... - Clemens
@Clemens 我猜在这里 http://geekswithblogs.net/NewThingsILearned/archive/2008/08/25/refresh--update-wpf-controls.aspx - 至少它与上面的代码匹配 - 尽管我在许多地方都看到了这个想法。 - davisoa
@Clemens 把我的代码放到谷歌上,你就能找到那篇文章。很容易弄明白的,伙计。不管怎样,那篇文章很糟糕,没有详细解释任何东西。我想知道细节。 - snowy hedgehog
把我的代码放到谷歌里,你就能找到那篇文章。@davisoa已经这样做了,再次感谢他的努力。 - Clemens
有类似的代码,都是做同样的事情,我想知道在幕后发生了什么。如果你不知道为什么,请不要把这变成一场讨论。如果你想讨论类似的任何事情,请创建一个聊天室。我很乐意加入你的聊天。 - snowy hedgehog
显示剩余3条评论
2个回答

3

微软建议使用PushFrame以稍微不同的方式执行您的代码。

该代码与渲染无关。它所做的类似于VB6和WinForms中已知的DoEvents方法。 DoEvents在泵送Windows消息队列并处理队列中的消息时暂停程序。这包括任何渲染消息,如WM_PAINTWM_NCPAINT

该代码指示Dispatcher停止当前线程并抽取其队列,处理所有具有DispatcherPriority.Render或更高优先级的消息。例如,如果{{link1:InvalidateRect}}在框架的某个位置调用,则会处理任何待处理的呈现消息,并重新呈现UI。 DoEvents一直被认为是一种代码异味,因为它绕过了消息队列。如果您想要一个响应迅速的用户界面,应使用工作线程。

推送帧链接不再有效。 - David Sykes

1
这可以用于强制WPF更新UI,因为调用的优先级较高。由于此调用同步使用Dispatcher,任何已排队具有相等或更高优先级(DispatcherPriority.Render)的任务都将在运行提供的委托之前运行。
以下是DispatcherPriority可能的值列表,它解释了调度程序按顺序运行任务的方式。

我仍然不明白为什么会更新UI?它等待具有“发送”,“正常”优先级的任务完成,然后执行空操作,就这样。没有重新测量,重新排列和重新渲染以更新UI。 - snowy hedgehog
我相信“渲染”优先级包括执行测量、排列和当然是渲染的任务 - 我正在寻找一些定义此处发生情况的东西。 - davisoa
渲染只是优先级,不包括任何额外的任务。 - snowy hedgehog
渲染是您正在添加的任务的优先级,但调度程序具有自己的渲染任务。已在队列中的其他任务正在被执行,导致 UI 更新。 - davisoa
如果Dispatcher没有任何当前的渲染任务,那该怎么办?如果所有的任务都已经渲染完成,没有更多的任务需要处理,那么Dispatcher将是空的。当Dispatcher为空时,你插入一个空任务,那又会怎样呢? - snowy hedgehog
请问您能否删除您的问题。它对任何人都没有帮助。每个人都知道有关Dispatcher的一般事情,但我正在寻找为什么会发生这些事情的详细信息。 :) - snowy hedgehog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接