繁体   English   中英

从其他线程添加UserControl

[英]Add UserControl from other thread

我有我的用户控件。 我将这些用户控件(100或以上)的集合添加到面板。 然后将此面板添加到主窗体中。 所有这些都是在运行时完成的。 由于有这么多用户控件,我的主窗体会在添加这些用户控件之前无响应。

我想知道我是否可以先将面板添加到表单中,然后从单独的线程创建我的用户控件并将它们添加到同一面板,因此我的主表单始终可供用户使用。 我所有的努力都会导致:

'跨线程操作无效'错误。

如果有人可以帮助我,我会很满意的。

这就是我现在正在做的事情

void main(){
    MyPanel pnlObj = new MyPanel();
    this.Controls.Add(pnlObj);
}

Class MyPanel{

    public void Panel()
    {
        MyUserControl uc1 = new MyUserControl();
        MyUserControl uc2 = new MyUserControl();
        this.Add(uc1);
        this.Add(uc2);
    }
}

你不能在非UI线程中使用可视元素,对不起。

但是你可以做的是在非UI线程中创建所有必要的数据,并委托创建UI元素并将UI更新到UI线程。

这看起来像这样:

// in background thread
ComputeDataSlowly();
MainForm.Invoke(() =>
{
    var control = CreateNewControlFromData();
    MainForm.Add(control);
});

我不确定你的问题是否有解决方案。 只有GUI线程可以更新控件,所以即使你确实使用了一个额外的线程,你仍然需要通过Invoke/BeginInvoke将创建/添加控件的工作转发到GUI线程,这会导致回到原来的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM