0

是否可以通过类似于此非工作代码的线程来创建控件?

Thread t1 = new Thread(() => Panel p = create_control(param1,param2);
t1.start();
this.Controls.Add(p);

该类create_control看起来类似于:

Panel p = new Panel();
p.Location...
p.Size...
p.Name...
return p;
4

1 回答 1

0

我想这就是你要问的,

首先你有一个类可以创建一个带参数的控件

public class CreateControl
{

    public Control Create(string name, Point location, Size size)
    {
        Panel p = new Panel();
        p.Name = name;
        p.Location = location;
        p.Size = size;
        p.BackColor = Color.Red;

        return p;
    }
}

然后在winform中就可以使用线程创建控件了,按照Tinwor的建议,使用窗体的invoke方法将控件添加到窗体时需要避免跨线程操作异常。

public partial class Form1 : Form
{
    public delegate void AddToControl(Control control);
    public AddToControl MyAddToControl;

    public Form1()
    {
        InitializeComponent();

    }


    private void button1_Click(object sender, EventArgs e)
    {
        Thread t1 = new Thread((ThreadStart)delegate
                                                {
                                                    CreateControl c = new CreateControl();
                                                    Panel p = (Panel)c.Create("panel_1", new Point(10, 10), new Size(100, 100));
                                                    AddControlToControls(this, p);
                                                });
        t1.Start();
    }

    public void AddControlToControls(Control parent, Control control)
    {
        MyAddToControl = new AddToControl(this.AddControl);
        parent.Invoke(this.MyAddToControl, control);
    }

    public void AddControl(Control control)
    {
        this.Controls.Add(control);
    }
}

所以基本上是的,它可以做到。我相信可以改进代码以使其更简洁。希望这可以帮助。

于 2013-10-10T10:47:57.070 回答