Добавить элемент управления WPF во время выполнения
Я написал WPF UserControl и хочу добавить одно или несколько из них в мое окно во время выполнения, когда я нажимаю кнопку. Как я могу это сделать?
Изменить: Дополнительная спецификация
Я хочу добавить usercontrols в Canvas и установить абсолютную позицию. Холст представляет собой рисунок полов в моем доме, и каждый пользовательский элемент управления имеет свойства, указывающие, где находится его дом. Поэтому я хочу, чтобы все элементы управления располагались в правильном положении на холсте.
Я думаю что-то вроде этого
var light = new LightUserControl(2);
HouseCanvas.Children.Add(light); // this should be positioned in a specific place
Ответы
Ответ 1
После добавления элемента управления в Canvas вам нужно указать верхнюю и левую координаты, используя прикрепленные свойства Canvas.Top и Canvas.Left следующим образом.
var light = new LightUserControl(2);
HouseCanvas.Children.Add(light);
Canvas.SetLeft(light, 20);
Canvas.SetTop(light, 20);
Ответ 2
Если вы хотите добавить элемент управления в Grid вместо Canvas, вы можете указать все свойства Grid через статический класс Grid следующим образом:
Label newLabel = new Label();
newLabel.Content = "The New Element";
Main.Children.Add(newLabel);
Grid.SetColumn(newLabel, 0);
Grid.SetRow(newLabel, 0);
Ответ 3
Добавьте StackPanel в окно и на каждом нажатии кнопки
_stackPanel.Children.Add(new YourControl());
Вы можете сделать это разными способами.
Ответ 4
Мое решение:
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;
}
Ответ 5
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;
}
Ответ 6
Просто дополняя ответ:
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
}