2008-11-22 2 views
28

Я написал WPF UserControl и хочу добавить одно или несколько из них в мое окно во время выполнения, когда я нажимаю кнопку. Как я могу это сделать?Добавить элемент управления WPF во время выполнения

Редактировать: Дополнительная информация Я хочу добавить пользовательские элементы на холст и установить абсолютное положение. Холст представляет собой рисунок полов в моем доме, и каждый пользовательский элемент управления имеет свойства, указывающие, где находится его дом. Поэтому я хочу, чтобы все элементы управления были расположены в правильном положении на холсте.

Я думаю, что-то вроде этого

var light = new LightUserControl(2); 
HouseCanvas.Children.Add(light); // this should be positioned in a specific place 

ответ

39

После того, как вы добавили свой элемент управления в Canvas, вам нужно указать верхнюю и левую координаты, используя прикрепленные свойства Canvas.Top и Canvas.Left следующим образом.

var light = new LightUserControl(2); 
HouseCanvas.Children.Add(light); 
Canvas.SetLeft(light, 20); 
Canvas.SetTop(light, 20); 
+0

Это прекрасно, спасибо! – 2009-02-18 20:12:13

3

Добавить StackPanel в окно и при каждом нажатии кнопки,

_stackPanel.Children.Add(new YourControl()); 

Вы можете сделать это во многих отношениях.

+0

Спасибо., Собственность .Чтобы были нужны мне – 2008-11-22 09:31:12

+0

Пожалуйста, отметьте этот ответ в ответе. – Micah 2008-11-25 16:17:47

12

В случае, если вы хотите добавить элемент управления к сетке вместо холста можно указать все свойства сетки через статический класс сетки следующим образом:

Label newLabel = new Label(); 
label.Content = "New Element"; 
Main.Children.Add(newLabel); 
Grid.SetColumn(newLabel, 0); 
Grid.SetRow(newLabel, 0); 
2

Мое решение:

for (i = 1; i <= buttoncount; i++) 
{ 
    Button mybutton = new Button(); 
    Grid1.Children.Add(mybutton); 
    mybutton.Height = 100; 
    mybutton.Width = 100; 
    mybutton.Name = "button" + i; 
    mybutton.Content = mybutton.Name; 
} 
0
public static void AddChild(this Visual parent, UIElement child) 
    { 
     if (InternalAddChild(parent, child)) 
     { 
      return; 
     } 
     throw new NotSupportedException(); 
    } 
    private static bool InternalAddChild(Visual parent, UIElement child) 
    { 
     Panel panel = parent as Panel; 
     if (panel != null) 
     { 
      panel.Children.Add(child); 
      return true; 
     } 
     for (int i = VisualTreeHelper.GetChildrenCount(parent) - 1; i != -1; i--) 
     { 
      Visual target = VisualTreeHelper.GetChild(parent, i) as Visual; 
      if (target != null && InternalAddChild(target, child)) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
0

Только дополняя ответ:

for (i = 1; i <= buttoncount; i++) 
{ 
    Button mybutton = new Button(); 
    Grid1.Children.Add(mybutton); 
    mybutton.Height = 100; 
    mybutton.Width = 100; 
    mybutton.Name = "button" + i; 
    mybutton.Content = mybutton.Name; 
    mybutton.Click += button_Click; 
} 

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    // do something 
} 
Смежные вопросы