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에서 스레드를 사용하여 컨트롤을 만들 수 있습니다. d 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);
}
}
본질적으로 그렇습니다. 코드를 좀 더 간결하게 만들 수 있다고 확신합니다. 희망이 도움이됩니다.
wpf use dispatcher – wudzik
질문해야 할 질문은 "내가 왜 이러는거야?"입니다. –
네, 가능하지만 왜 그걸하고 싶습니까? WinForms에서 한 스레드에서 컨트롤을 만들면 다른 스레드에서 생성 된 컨트롤에 추가 할 수 없습니다. (간단히 쓸모가 없습니다) –