是否可以通过类似于此非工作代码的线程来创建控件?
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;
是否可以通过类似于此非工作代码的线程来创建控件?
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;
我想这就是你要问的,
首先你有一个类可以创建一个带参数的控件
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);
}
}
所以基本上是的,它可以做到。我相信可以改进代码以使其更简洁。希望这可以帮助。