use*_*ame 10 c# events user-controls load winforms
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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14906 次 |
最近记录: |