2013-10-10 38 views
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; 
+1

如果它是wpf使用调度程序 – wudzik

+2

你应该问的问题是:“我为什么要这样做?”。 –

+0

是的,可能,但你为什么要这么做?在WinForms中,如果你在一个线程中创建一个控件,你不能将它添加到在另一个线程中创建的控件中(简直没用) –

回答

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中你可以使用线程来创建控件,而你也可以d通过使用表单的调用方法(如Tinwor建议的)将控件添加到窗体时避免出现跨线程操作异常。

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); 
    } 
} 

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

+0

谢谢user1584413。通常,它不能解决我的问题,但仅仅是因为我的代码比我发布的复杂得多。奇怪的是,加载持续更长的时间,比原来的时间是。无论如何,你的答案可能会帮助别人寻找类似的话题。 – user2039470

+1

老实说,我同意其他人对你为什么首先要这样做,加载线程,而在某些情况下加快速度,在其他情况下可能会相当昂贵,因为它需要为他们创建线程和存储等,所以我不惊讶它可能会减慢你的速度。但是,虽然我同意其他人你没有问我应该这样做,你问是否可以完成。如果你在单一表单上有很多控件,试图将它们分离到用户控件中,可能会使它们更易于管理,并且只根据需要加载它们,而不是全部在表单加载上。 –