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

Спасибо пользователю1584413. Непросто, это не решило мою проблему, а только потому, что мой код намного сложнее, чем я опубликовал. Странно то, что загрузка длится дольше, чем оригинальное время. В любом случае, ваш ответ может помочь кому-то, кто ищет подобную тему. – user2039470

+1

Честно говоря, я согласен с остальными о том, почему вы хотите это в первую очередь, загружая темы, в то время как ускорение ситуации в некоторых ситуациях может в других быть довольно дорогостоящим, поскольку для создания потоков и хранения для них и т. Д. Я не удивлен, что это может замедлить вас. Но пока я согласен с другими, которых вы не спрашивали, должен ли я это делать, вы спросили, можно ли это сделать. Если у вас так много элементов управления в одной форме, что бы попытаться отделить их от пользовательских элементов управления, это может сделать их более управляемыми и загружать только по мере необходимости, а не только на загрузку формы. –

Смежные вопросы