2013-10-10 39 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

老實說,我同意其他人對你爲什麼首先要這樣做,加載線程,而在某些情況下加快速度,在其他情況下可能會相當昂貴,因爲它需要爲他們創建線程和存儲等,所以我不驚訝它可能會減慢你的速度。但是,雖然我同意其他人你沒有問我應該這樣做,你問是否可以完成。如果你在單一表單上有很多控件,試圖將它們分離到用戶控件中,可能會使它們更易於管理,並且只根據需要加載它們,而不是全部在表單加載上。 –