gpt4 book ai didi

c# - WPF 中的 BeginUpdate 等价物?

转载 作者:太空狗 更新时间:2023-10-29 17:35:27 25 4
gpt4 key购买 nike

我的问题是我需要向 WPF 中的 ListBox 添加很多项。在 WinForms 中,您只需使用 BeginUpdate(); 方法,添加所有内容,最后使用 EndUpdate(); 方法。

那么,我如何停止在 WPF 列表框中绘制,直到添加了每个项目,然后一次性绘制所有内容?

最佳答案

正确使用 Dispatcher。

您必须从 Dispatcher 线程向 ListBox(或其数据源)添加内容,否则 UI 会爆炸。当您执行此操作时,您要么已经处于该线程的方法中,要么(希望更有可能)处于后台线程中并使用 Dispatcher.BeginInvoke 添加项目。

当您将更新踢到 Dispatcher 时,使用 Dispatcherpriority.Normal 作为优先级。 Dispatcher 有一个工作项队列,您的 Normal 项将被插入(可能令人惊讶)该队列的高位。

当基础数据发生更改时,WPF 运行以更新数据绑定(bind)的代码位以 DispatcherPriority.DataBind 运行,低于 Normal。这意味着数据绑定(bind)通常不会更新,直到您添加了所有项目(或者,如果您的项目需要很长时间才能添加,则可能会在 Dispatcher 在添加项目之间空闲时发生)。

实际呈现您的控件的代码位(例如,当它的绑定(bind)发出更新信号时)在 DispatcherPriority.Render 运行,甚至比绑定(bind)的优先级更低。这意味着您的控件只会在 Dispatcher 用完要更新的绑定(bind)时呈现,而这反过来只会在 Dispatcher 用完要处理的项目添加时发生。

如果这听起来很奇怪,请记住每一层(更新 - 绑定(bind) - 渲染)都会导致在下面的层上设置一个隐喻标志 - 你不会得到十个绑定(bind)然后发生十个渲染。如果您的项目添加速度很快,您将获得所有添加,然后进行一次绑定(bind)和一次渲染 - 这是完美的。

基本上:如果您按预期使用 Dispatcher,您就没有什么可担心的。将渲染作为 Dispatcher 上相对较低的优先级似乎是“错误的”,但实际上,它非常聪明:-)

关于c# - WPF 中的 BeginUpdate 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2769396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com