gpt4 book ai didi

c# - 如何确定用户控件何时完全加载并显示?

转载 作者:可可西里 更新时间:2023-11-01 09:09:11 25 4
gpt4 key购买 nike

stackoverflow上已经有几个类似的问题了,但是我还没找到答案

我有一个包含多个标签页的应用程序。在其中一个上,我一次加载了几十个用户控件的列表。目前我正在 Load 事件中执行此操作,因此在加载此页面之前我有一个小延迟。我想做的是让 UI 更具响应性,并在页面完全加载后填充列表。有什么方法可以跟踪用户控件何时完全加载其内容?

VisibleChanged 也无济于事,因为它在显示任何其他子控件之前触发。当我开始加载控件列表时某些子控件仍然不可见时,这会导致一些难看的视觉效果。

编辑

为了更清楚。我在页面容器上有一些子控件,我有一个自定义控件列表,我稍后会尝试加载。下面几个答案中描述的两种方法的问题是,当我开始加载控件时,它们不会让容器上的其他子控件显示出来,这就是为什么我有那些丑陋的效果(我正在这样做BackgroundWorker,但无论如何它都必须与主线程交互才能将控件添加到列表中)

最佳答案

为了使 UI 响应更快,您应该向自己发送一条消息 (Control.BeginInvoke),执行一个操作,向自己发送另一条消息。然后,每次您执行任何操作时,下一步都会排在所有用户消息之后,因此用户操作会得到及时处理。

一个非常好的方法是使用 yield return 并让编译器处理所有闭包逻辑:

IEnumerable AsyncLoadUI()
{
var p = new Panel();
Controls.Add(p);
yield return null;

for( int i = 0; i < 50; ++i ) {
var txt = new TextBox();
p.Controls.Add(txt);
yield return null;
}
}

override void OnLoad(EventArgs e)
{
IEnumerator tasks = AsyncLoadUI().GetEnumerator();
MethodInvoker msg = null;
msg = delegate { if (tasks.MoveNext()) BeginInvoke(msg); };
msg();
}

关于c# - 如何确定用户控件何时完全加载并显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6652933/

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